二分图匹配(匈牙利算法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 }
原文地址:https://www.cnblogs.com/redlight/p/2477643.html