hdu 2063 过山车

http://acm.hdu.edu.cn/showproblem.php?pid=2063(这是一道中文题,题目就不说了,自己读。)

这是做的第一道二分匹配的题,直接套匈牙利算的模板,直接ac。不过重要的是里面有很多重要的图论的知识,但是自己理解的还不是很透彻,所以写不出来,也不想拿别人,先放着吧,改天写。

下面是ac的。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 int vis[505],cmp[505][505];//vis记录在当前第u个女生的情况下,是否被挑选过;cmp是记录女生和男生的关系;
 7 int cm[505];//cm[i]=u,表示第i个男生和第u个女生配对;
 8 int k,m,n;
//传进来的是女生的编号。如果能当前女生和前面的女生有喜欢的相同的男生,
//就让前面的女生去找另外的男生,如果实在找不到就返回。
 9 int inint(int u)
10 { 11 for(int i=1; i<=n; i++) 12 { 13 if(cmp[u][i]&&!vis[i]) 14 { 15 vis[i]=1; 16 if(!cm[i]||inint(cm[i])) 17 { 18 cm[i]=u; 19 return 1; 20 } 21 } 22 } 23 return 0; 24 } 25 int main() 26 { 27 int a,b,sum; 28 while(scanf("%d",&k)==1,k!=0) 29 { 30 scanf("%d%d",&m,&n); 31 memset(cmp,0,sizeof(cmp)); 32 for(int i=0; i<k; i++) 33 { 34 scanf("%d%d",&a,&b); 35 cmp[a][b]=true; 36 } 37 memset(cm,0,sizeof(cm)); 38 sum=0; 39 for(int i=1; i<=m; i++)//i表示女生的编号 40 { 41 memset(vis,0,sizeof(vis));//每一个女生都要重新任意挑选男生 42 if(inint(i)) sum++;// 43 } 44 printf("%d ",sum); 45 } 46 return 0; 47 }
原文地址:https://www.cnblogs.com/zzulipomelo/p/4839884.html