标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1498
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1918 Accepted Submission(s):
1058
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 5 using namespace std; 6 7 int n,m; 8 int vis[110],Map[110][110],ok[110],cc[55]; 9 10 bool Find(int x,int now) 11 { 12 for (int i=1; i<=n; i++) 13 { 14 if (!vis[i]&&Map[x][i]==now) 15 { 16 vis[i]=1; 17 if (!ok[i]) 18 { 19 ok[i]=x; 20 return true; 21 } 22 else 23 { 24 if (Find(ok[i],now)) 25 { 26 ok[i]=x; 27 return true; 28 } 29 } 30 } 31 } 32 return false; 33 } 34 35 int main() 36 { 37 int flag,ans,s[110]; 38 while (~scanf("%d%d",&n,&m)) 39 { 40 flag=0; 41 memset(cc,0,sizeof(cc)); 42 memset(Map,0,sizeof(Map)); 43 if (n==0&&m==0) 44 break; 45 for (int i=1; i<=n; i++) 46 { 47 for (int j=1; j<=n; j++) 48 { 49 scanf("%d",&Map[i][j]); 50 cc[Map[i][j]]=1;//记录这个颜色出现过 51 } 52 } 53 memset(ok,0,sizeof(ok)); 54 int k=0; 55 for (int i=1; i<=50; i++) 56 { 57 memset(ok,0,sizeof(ok)); 58 ans=0; 59 if (cc[i]==1) //判断颜色是否出现过,加入这里不进行标记的话最后输出的是没有被刷完的颜色数字,就会输出一些乱七八糟的东西 60 { 61 for (int j=1; j<=n; j++) 62 { 63 memset(vis,0,sizeof(vis)); 64 if (Find(j,i)) 65 ans++; 66 } 67 if (ans>m) //如果最大匹配数大于m次的话就是刷不完的 68 { 69 s[++k]=i; 70 flag=1; 71 } 72 } 73 } 74 if (flag==0) 75 printf ("-1\n"); 76 else 77 { 78 for (int i=1; i<k; i++) //控制输出格式 79 { 80 printf ("%d ",s[i]); 81 } 82 printf ("%d\n",s[k]); 83 } 84 } 85 return 0; 86 }
hdu 1498 50 years, 50 colors(二分匹配_匈牙利算法)
标签:
原文地址:http://www.cnblogs.com/qq-star/p/4707383.html