标签: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