hdu 149850 years, 50 colors 最大匹配
题目地址: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 101 int 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; }