模板:二分圖匹配(匈牙利演算法的DFS實現)
阿新 • • 發佈:2021-01-19
技術標籤:演算法模板
/* ***************************************************
二分圖匹配(匈牙利演算法的DFS實現)
INIT:G[][]兩邊定點劃分的情況
CALL:res=Hungary();輸出最大匹配數
優點:適於稠密圖,DFS找增廣路快,實現簡潔易於理解
時間複雜度:O(VE);
*************************************************** */
const int MAXN = 510;
int uN,vN;//u,v數目
int G[MAXN][MAXN];//編號是1~n的
int linker[ MAXN];
bool used[MAXN];
bool dfs(int u)
{
int v;
for(v=1;v<=vN;v++){
if(G[u][v]&&!used[v]){
used[v]=true;
if(linker[v]==-1||dfs(linker[v])){
linker[v]=u;
return true;
}
}
}
return false;
}
int Hungary()
{
int res=0;
int u;
memset(linker,-1,sizeof(linker));
for(u=1;u<=uN;u++){
memset(used,false,sizeof(used));
if(dfs(u)) res++;
}
return res;
}