匈牙利演算法:用來求二分圖的最大匹配,核心在於求增廣路徑並且取反。也就是已經在匹配中的邊變成不在匹配中的,不在配中的邊變成在匹配中。網上可以找到很多的**,但是我還是自己寫了一遍,實現的並不優美,全域性變數多到**,以後還是應該多看看別人的**來學習。
比如增廣路徑的尋找過程中找到乙個已經在匹配中的邊,這條邊其實是不用找的,我的做法是在匹配矩陣中去遍歷來尋找,但其實我們
只要對右側的點用陣列記錄這個點對應的匹配位置就可以了。
**如下:
// 匈牙利演算法.cpp : 定義控制台應用程式的入口點。
//今晚一定要把這個演算法寫完 不寫完不睡覺
#include "stdafx.h"
#include#includeusing namespace std;
vector> connection, matched, inpath;//分別表示鄰接矩陣,匹配結果,一條邊是否在增廣路徑中
vectorused;
int m, n;
bool dfs(int i, bool isinmatched)
else //否則以j為起點尋找一條在匹配中的邊}}
} return false;//若在迴圈中找到增廣路徑 則會返回true 否則在尾部返回false 表示在此點處找不到增廣路徑
} else//尋找在匹配中的邊,本可以陣列形式儲存,省略此尋找過程,是我太傻
}} return false; }}
int _tmain(int argc, _tchar* argv)
connection[i][j] = true;
} cin.sync();
cin.clear();
for (i = 1; i <= m; ++i)
}inpath = temp;
} }for (int i = 1; i <= m; ++i) }
return 0;
}
我花了好幾天才終於弄完這個,其實並不難,只是中間的遞迴過程設計的時候稍微費了點事,但是主要是自己太拖延了,總想寫沒用事情,希望自己接下來幾天能抓緊時間吧。
python實現匈牙利演算法
1.通過深度優先搜尋實現匈牙利演算法 coding utf 8 created by lixiao at 2019 4 16 class dfs hungary def init self,nx,ny,edge,cx,cy,visited self.nx,self.ny nx,ny x和y集合中頂點...
匈牙利演算法
匈牙利演算法 edmonds演算法 步聚 1 首先用 標記x中所有的非m頂點,然後交替進行步驟 2 3 2 選取乙個剛標記 用 或在步驟 3 中用 yi 標記 過的x中頂點,例如頂點xi,如果xi與y為同一非匹配邊的兩端點,且在本步驟中y尚未被標記過,則用 xi 去標記y中頂點y。重複步驟 2 直至...
匈牙利演算法
匈牙利演算法用來解決二分圖的最大匹配問題。乙個典型的最大匹配問題的描述如下 乙個公司有n項工作,m個員工。每個員工能勝任n項工作中的幾項 0 n 工作。問題是,如何分配才能使得被處理的工作數最大。當然,如果公司裡人員很多,每項工作都有很多員工可以勝任,那麼使每項工作都有人處理的方案是顯而易見的。但遇...