hdu 149850 years, 50 colors

来源:互联网 发布:网络语al是什么意思 编辑:程序博客网 时间:2024/05/22 07:49
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1498
/*  题意:  给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球   的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操   作后有那几种颜色的气球是不能被完全扎破的.   解题思路:  使用二部图最大匹配,寻找每种颜色的最大匹配数,(行,列分别为两个匹配)  如果都在m次内可以被刺破,则输出 -1 否则的话,按不能被刺破的气球  编号从小到大进行输出。*/#include<stdio.h>#include<string.h>#include<algorithm>#define maxn 101int map[maxn][maxn],n,m,color[maxn],vis[maxn],mark[maxn],cb[maxn];bool dfs(int k,int v){for(int i = 1; i <= n; i++){if(map[i][v] != k || vis[i])continue;vis[i] = 1;if(!mark[i] || dfs(k,mark[i])){mark[i] = v;return true;}}return false;}int cmp(const void *a ,const void *b){return (int *)a - (int *)b;}int main(){int i,j,ans,num,color_num;while(~scanf("%d%d",&n,&m) && (n||m)){for(i = 1; i <= n; i++){for(j = 1; j <= n; j++){scanf("%d",&map[i][j]);}}num = 0;for(i = 1; i <= 50; i++){ans = 0;memset(mark,0,sizeof(mark));for(j = 1; j <= n; j++){memset(vis,0,sizeof(vis));if(dfs(i,j))ans++;}if(ans > m)cb[num++] = i;}if(num == 0)printf("-1\n");else{qsort(cb,num,sizeof(int),cmp);for(i = 0; i < num - 1; i++)printf("%d ",cb[i]);printf("%d\n",cb[i]);}}return 0;}

原创粉丝点击