过山车(匈牙利算法,最大二分图匹配)

http://acm.hdu.edu.cn/showproblem.php?pid=2063

 1 #include <iostream>

 2 #include <cstdio>

 3 #include <cstring>

 4 using namespace std;

 5 const int N = 500+10;

 6 int gil,boy;

 7 int gil_boy[N][N];

 8 int flg[N];//在递归过程中男生N是否有女朋友

 9 int bg[N];//男生N的女朋友

10 //匈牙利算法

11 int xfind(int g)//女生g找男朋友

12 {

13     int b;//男生b

14     for(b=1;b<=boy;b++)//找可以匹配的男生

15     {

16         if(gil_boy[g][b]&&!flg[b])//可以匹配并且该男生在这一轮中还没有匹配

17         {

18             flg[b]=1;//匹配

19             if(!bg[b]||xfind(bg[b]))//该男生没有女朋友或者他的女朋友可以再找一个男朋友

20             {

21                 bg[b]=g;//女生g找到男朋友b,匹配成功

22                 return 1;

23             }

24         }

25     }

26     return 0;//匹配失败

27 }

28 int main()

29 {

30     int i,m,g,b,ans;

31     while(cin>>m&&m)

32     {

33         cin>>gil>>boy;ans=0;

34         memset(gil_boy,0,sizeof(gil_boy));

35         memset(bg,0,sizeof(bg));

36         for(i=0;i<m;i++)

37         {

38             scanf("%d%d",&g,&b);

39             gil_boy[g][b]=1;

40         }

41         for(g=1;g<=gil;g++)//每个女生找男朋友

42         {

43             memset(flg,0,sizeof(flg));

44             if(xfind(g)) ans++;//女生找到男朋友

45         }

46         cout<<ans<<endl;

47     }

48     return 0;

49 }

 

你可能感兴趣的:(二分图)