现在的位置: 首页 > 综合 > 正文

hdu 1498 50 years, 50 colors

2017年10月13日 ⁄ 综合 ⁄ 共 853字 ⁄ 字号 评论关闭

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

思想:

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

抱歉!评论已关闭.