一道简单的最小点覆盖问题。。。
思想:
将每个点的x和y看作一条路径的两个端点。。
对于每个种类的气球。进行一次最大匹配搜索。。。
核心:
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a),map[i][j]=a,num[a]++;
用num数组标记出现的气球种类:后续遍历;
代码如下:
#include<stdio.h>
#include<string.h>
int map[102][102];
int link[102];
int vis[102];
int num[102];
int n,k;
int find(int a,int z)
{
for(int i=0; i<n; i++)
{
if(!vis[i]&&map[a][i]==z)
{
vis[i]=1;
if(link[i]==-1||find(link[i],z))
{
link[i]=a;
return 1;
}
}
}
return 0;
}
int sum(int z)
{
int res=0;
memset(link,-1,sizeof(link));
for(int i=0; i<n; i++)
{
memset(vis,0,sizeof(vis));
if(find(i,z))
res++;
}
return res;
}
int main()
{
while(scanf("%d%d",&n,&k),n+k)
{
memset(num,0,sizeof(num));
int a;
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a),map[i][j]=a,num[a]++;
int flag=0;
for(int i=1; i<=50; i++)
if(num[i])
{
int t=sum(i);
//printf("i-->%d t-->%d\n",i,t);
if(t>k)
{
if(flag)
printf(" ");
printf("%d",i);
flag=1;
}
}
if(!flag)
printf("-1");
printf("\n");
}
return 0;
}