【模板】匈牙利算法 二分图最大匹配题模板
生活随笔
收集整理的這篇文章主要介紹了
【模板】匈牙利算法 二分图最大匹配题模板
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
【任務】
給定一個二分圖,用匈牙利算法求這個二分圖的最大匹配數。
【說明】
求最大匹配,那么我們希望每一個在左邊的點都盡量找到右邊的一個點和它匹配。
我們一次枚舉左邊的點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; }這個我打算寫給自己寫題學習時用的,發出來供大家參考。
樣題:http://www.cnblogs.com/zhangjiuding/p/7538564.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的【模板】匈牙利算法 二分图最大匹配题模板的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 新疆大学(新大)OJ xju 1006
- 下一篇: 关于逆元的概念、用途和可行性的思考(附5