这题就是用匈牙利算法算出每个气球需要几次才能打爆完,如果小于K次就可以打爆,代码如下;
<pre name="code" class="cpp">#include<stdio.h>
#include<string.h>
int n,k,map[1010][1010],match[1010],ck[1010];
int search(int a,int x)
{
int i;
for(i=1;i<=n;i++)
{
if(map[x][i]==a&&!ck[i])
{
ck[i]=1;
if(match[i]==0||search(a,match[i]))
{
match[i]=x;
return 1;
}
}
}
return 0;
}
int hungary(int a)
{
int i,sum;
sum=0;
memset(match,0,sizeof(match));
for(i=1;i<=n;i++)
{
memset(ck,0,sizeof(ck));
if(search(a,i))
sum++;
}
return sum;
}
int main()
{
int i,j,a[51],s[51];
while(scanf("%d%d",&n,&k),n||k)
{
memset(s,0,sizeof(s));
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
{
scanf("%d",&map[i][j]);
s[map[i][j]]++;
}
memset(a,0,sizeof(a));
for(j=0,i=1;i<=50;i++)
{
if(k<hungary(i))
{
a[j]=i;
j++;
}
}
if(j==0)
printf("-1\n");
else
{
for(i=0;i<j-1;i++)
printf("%d ",a[i]);
printf("%d\n",a[j-1]);
}
}
return 0;
}