标签:des style http color java os io strong
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
题意,给出n*n的矩阵,每个点上一个气球,颜色有的不同,对每一种颜色可以打k次,每次可以打掉一行或者一列的相同颜色的色球。如果可以消灭完,就不输出,否则输出气球的颜色,如果全部消灭完 输出-1
就是对每一种颜色进行一次二分匹配,判断可不可以在k次内消灭完。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; int mm[120][120] , c[100] ; struct node { int v ; node *next ; } *head[120]; int link[120] , temp[120] , top , p[120]; int f(int i) { for( node *q = head[i] ; q != NULL ; q = q->next ) { int v = q->v ; if( !temp[v] ) { temp[v] = 1 ; if( link[v] == -1 || f( link[v] ) ) { link[v] = i ; return 1; } } } return 0; } int main() { int i , j , k , n , m , ans ; while(scanf("%d %d", &n, &m) && n+m != 0) { memset(c,0,sizeof(c)); for(i = 1 ; i <= n ; i++) for(j = 1 ; j <= n ; j++) { scanf("%d", &mm[i][j]); c[ mm[i][j] ]++ ; } top = 0 ; for(i = 1 ; i <= 50 ; i++) { ans = 0 ; memset(head,NULL,sizeof(head)); memset(link,-1,sizeof(link)); if( !c[i] ) continue ; for(j = 1 ; j <= n ; j++) for(k = 1 ; k <= n ; k++) { if( mm[j][k] == i ) { node *q = new node ; q->v = k ; q->next = head[j] ; head[j] = q ; } } for(j = 1 ; j <= n ; j++) { memset(temp,0,sizeof(temp)); if( f(j) ) ans++ ; } if( ans > m ) p[top++] = i ; } if(top == 0) printf("-1\n"); else { for(i = 0 ; i < top ; i++) if(i == top-1) printf("%d\n", p[i]); else printf("%d ", p[i]); } } return 0; }
hdu1498--50 years, 50 colors(二分匹配,题意。。。),布布扣,bubuko.com
hdu1498--50 years, 50 colors(二分匹配,题意。。。)
标签:des style http color java os io strong
原文地址:http://blog.csdn.net/winddreams/article/details/38583691