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

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 }

 

posted @ 2012-07-12 16:54  qijinbiao1  阅读(257)  评论(0编辑  收藏  举报