二分图匹配(匈牙利算法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 }

 

你可能感兴趣的:(DFS)