解题报告
题意:
给你一个矩阵,矩阵里面是气球,气球有1-50种颜色,问你在k次之内能不能把那种存在的颜色消掉(每种颜色k次机会),不能消掉的颜色按升序输出。
思路:
白想一上午了,理解错了题意,原来每种有k次可以消除的机会,还以为是总共k次机会消气球。
理解对了就很好做,类似POJ3041
求最小点覆盖。用最少的点覆盖最多的边。
每次枚举颜色看是否操作次数超过k次。
英语。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。。。。。。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int k,n,m,mmap[1100][1100],vis[1100],pre[1100],num[1100];
int dfs(int x,int c) {
for(int i=1; i<=n; i++) {
if(!vis[i]&&mmap[x][i]==c) {
vis[i]=1;
if(pre[i]==-1||dfs(pre[i],c)) {
pre[i]=x;
return 1;
}
}
}
return 0;
}
int main() {
int i,j;
while(~scanf("%d%d",&n,&k)) {
memset(num,0,sizeof(num));
if(!n&&!k)break;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d",&mmap[i][j]);
int ans[100];
for(int c=1; c<=50; c++) {
memset(pre,-1,sizeof(pre));
for(i=1; i<=n; i++) {
memset(vis,0,sizeof(vis));
num[c]+=dfs(i,c);
}
}
int m=0,f=0;
for(i=1; i<=51; i++) {
if(num[i]&&num[i]>k) {
ans[m++]=i;
f=1;
}
}
if(!f) {
printf("-1\n");
continue;
}
sort(ans,ans+m);
for(i=0; i<m-1; i++) {
printf("%d ",ans[i]);
}
printf("%d\n",ans[m-1]);
}
}

1 1 1 2 1 1 1 1 2 2 1 1 2 2 2 5 4 1 2 3 4 5 2 3 4 5 1 3 4 5 1 2 4 5 1 2 3 5 1 2 3 4 3 3 50 50 50 50 50 50 50 50 50 0 0
-1 1 2 1 2 3 4 5 -1
HDU1498_50 years, 50 colors(二分图/最小点覆盖=最大匹配),布布扣,bubuko.com
HDU1498_50 years, 50 colors(二分图/最小点覆盖=最大匹配)
原文:http://blog.csdn.net/juncoder/article/details/38583459