二分图匹配(匈牙利算法DFS实现)
INIT :g[][] 邻接矩阵
CALL:res=MaxMatch();
时间复杂度为o(VE)
下面是二分图最大匹配的简单题(poj1274的代码),做出邻接矩阵后可以直接调用MaxMatch()函数使用:
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 6 const int MAXN=202; 7 int uN,vN;//u,v数目,需要初始化 8 bool g[MAXN][MAXN];//g[i][j]表示xi与yj相连,也就是要初始化的邻接矩阵 9 int xM[MAXN],yM[MAXN];//输出量 10 bool chk[MAXN];//辅助检查某轮y[v]是否被check 11 12 bool SearchPath(int u) 13 { 14 int v; 15 for(v=0;v<vN;++v) 16 { 17 if(g[u][v] && !chk[v]) 18 { 19 chk[v]=true; 20 if(yM[v]==-1 || SearchPath(yM[v])) 21 { 22 yM[v]=u; 23 xM[u]=v; 24 return true; 25 } 26 } 27 } 28 return false; 29 30 } 31 32 int MaxMatch() 33 { 34 int u,ret=0; 35 memset(xM,-1,sizeof(xM)); 36 memset(yM,-1,sizeof(yM)); 37 for(u=0;u<uN;++u) 38 { 39 if(xM[u]=-1) 40 { 41 memset(chk,false,sizeof(chk)); 42 if(SearchPath(u)) ret++; 43 } 44 } 45 return ret; 46 } 47 48 int main() 49 { 50 int x,y; 51 while(scanf("%d%d",&uN,&vN)!=EOF) 52 { 53 memset(g,false,sizeof(g));//注意这里每次要初始化 54 for(int i=0;i<uN;++i) 55 { 56 cin>>x; 57 for(int j=0;j<x;++j) 58 { 59 cin>>y; 60 g[i][y-1]=true; 61 } 62 } 63 cout<<MaxMatch()<<endl; 64 } 65 //system("pause"); 66 return 0; 67 }