hdu 1498 50 years, 50 colors

来源:互联网 发布:监控软件 linux 排行 编辑:程序博客网 时间:2024/05/01 18:21

一道简单的最小点覆盖问题。。。

思想:

将每个点的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;}


0 0
原创粉丝点击