標籤:二分圖最大匹配 ret i++ == 輸入 國際 eof nbsp memset
【任務】
給定一個二分圖,用匈牙利演算法求這個二分圖的最大匹配數。
【說明】
求最大匹配,那麼我們希望每一個在左邊的點都盡量找到右邊的一個點和它匹配。
我們一次枚舉左邊的點x的所有出邊指向的點y,
若y之前沒有被匹配,那麼(x,y)就是一對合法的匹配,我們將匹配數加一,
否則我們試圖給原來匹配的y和x‘重新找一個匹配,如果x‘匹配成功,那麼(x,y)就可以新增為一對合法的匹配。
給x‘尋找匹配的過程可以遞迴解決。
【介面】
int hungary();
複雜度O(|E|*sqrt(|V|))
輸入: n 全域變數,左側的點數
g 全域變數,g[i]表示與左邊點i相連的右邊的點
輸出:tot 最大匹配數
from 全域變數,from[i]表示最大匹配圖中與左邊點i相連的邊
【代碼】
//輸入:const int MAXN = 555; // 數組長度int n = 200; //n表示左側的點數vector <int> g[MAXN]; // 表示與左邊點i相連的右邊點//輸出:int from[MAXN];//表示最大匹配中與左邊點i相連的邊int tot; // 二分圖最大匹配數bool use[MAXN]; // 左邊點的使用標記//匈牙利演算法 模板題 ,match和hungary見小紅書ACM國際大學生程式設計競賽 演算法與實現bool match(int x){ for(int i = 0;i < g[x].size(); ++i){ if(!use[g[x][i]]){ use[g[x][i]] = true; if(from[g[x][i]] == -1 || match(from[g[x][i]])){ from[g[x][i]] = x; return true; } } } return false;}int hungary(){ tot = 0; memset(from,255,sizeof(from)); for(int i = 1;i <= n; i++){ memset(use,0,sizeof(use)); if(match(i)) ++tot; } return tot;}
這個我打算寫給自己寫題學習時用的,發出來供大家參考。
匈牙利演算法 二分圖最大匹配題模板