二分最大匹配的匈牙利算法模板
/* ***************************************************
二分图匹配(匈牙利算法的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;
}
例题:HDU 2063 过山车 (模板题)
#include<stdio.h>
#include < string .h>
#include <iostream>
using namespace std;
/* ***************************************************
二分图匹配(匈牙利算法的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;
}
int main()
{
int k;
while (scanf( " %d " ,&k)== 1 && k){
scanf( " %d%d " ,&uN,& vN);
memset(G, 0 , sizeof (G));
for ( int i= 1 ;i<=k;i++ ){
int u,v;
scanf( " %d%d " ,&u,& v);
G[u][v] = 1 ;
}
printf( " %d\n " ,Hungary());
}
return 0 ;
}
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did238233