bzoj1854 [Scoi2010]游戏——匈牙利算法
生活随笔
收集整理的這篇文章主要介紹了
bzoj1854 [Scoi2010]游戏——匈牙利算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目:https://www.lydsy.com/JudgeOnline/problem.php?id=1854
這題...據說可以用并查集做,但沒有去看...
用二分圖匹配的話,就把裝備和它的兩個屬性連邊,再從屬性開始從小到大進行匈牙利算法;
這樣可以保證匹配這個屬性時先確保前面的都匹配成功了;
所以遇到無法匹配的情況時就結束了,輸出即可;
小心TLE,所以避免 memset。
代碼如下:
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int const maxn=1000005,maxm=10005; int n,head[maxm],ct,pre[maxn],mx,ans; int vis[maxn]; struct N{int to,next;N(int t=0,int n=0):to(t),next(n) {} }edge[maxn<<1]; void add(int x,int y){edge[++ct]=N(y,head[x]); head[x]=ct;} bool dfs(int x) {for(int i=head[x],u;i;i=edge[i].next){if(vis[u=edge[i].to]!=ans) // if(!vis[u=edge[i].to])//TLE! {vis[u]=ans;if(!pre[u]||dfs(pre[u])){pre[u]=x; return 1;}}}return 0; } int main() {scanf("%d",&n);for(int i=1,x,y;i<=n;i++){scanf("%d%d",&x,&y);add(x,i); add(y,i);mx=max(mx,max(x,y));}for(int i=1;i<=mx;i++){ // memset(vis,0,sizeof vis);//TLE!ans++;if(!dfs(i)){printf("%d\n",ans-1); return 0;}}printf("%d",ans);return 0; }?
轉載于:https://www.cnblogs.com/Zinn/p/9208122.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的bzoj1854 [Scoi2010]游戏——匈牙利算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (2.19)备份与还原--备份的原理与总
- 下一篇: POJ2142-The Balance【