hdu 2063(最大匹配数)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2063

二分匹配水题,求最大匹配数(即求边数最多的匹配),匈牙利算法实现。。

View Code
 1 #include<iostream>

 2 const int MAXN=507;

 3 using namespace std;

 4 int k,m,n;

 5 int map[MAXN][MAXN];

 6 int cx[MAXN],cy[MAXN];

 7 int mark[MAXN];

 8 

 9 int dfs(int u){

10     for(int v=0;v<n;v++){

11         if(map[u][v]&&!mark[v]){

12             mark[v]=1;

13             if(cy[v]==-1||dfs(cy[v])){

14                 cx[u]=v;

15                 cy[v]=u;

16                 return 1;

17             }

18         }

19     }

20     return 0;

21 }

22 

23 int MaxMatch(){

24     int res=0;

25     memset(cx,-1,sizeof(cx));

26     memset(cy,-1,sizeof(cy));

27     for(int i=0;i<=m;i++){

28         if(cx[i]==-1){

29             memset(mark,0,sizeof(mark));

30             res+=dfs(i);

31         }

32     }

33     return res;

34 }

35 

36 

37 int main(){

38     while(~scanf("%d",&k)&&k){

39         scanf("%d%d",&m,&n);

40         int x,y;

41         memset(map,0,sizeof(map));

42         for(int i=0;i<k;i++){

43             scanf("%d%d",&x,&y);

44             map[x-1][y-1]=1;//这里只需单向就行了,因为dfs是就是从X集合的未盖点出发的

45         }

46         int ans=MaxMatch();

47         printf("%d\n",ans);

48     }

49     return 0;

50 }

51 

52 

53 

54     

 

你可能感兴趣的:(HDU)