• poj 2771 最大独立集


    这道题又无耻的抄袭了别人的代码。

    刚开始以为是最大匹配,把条件不相符的人连一起,然后求最大匹配,感觉麻烦,然后看了别人的解题报告,是把相符的人连一起,然后减去,其实就是最大独立集。

    最大独立集=|G|-最大匹配。

    首先先把性别分开,因为同性不能成为couple,然后把符合条件的异性连一起,然后就是最大匹配了。

    #include<stdio.h>
    #include<string.h>
    #define maxn 505
    #define maxl 106
    
    struct Person
    {
        int h;
        char music[maxl];
        char sport[maxl];
    } male[maxn], female[maxn];
    
    int uN, vN, n;
    bool g[maxn][maxn];
    int visit[maxn],match[maxn];
    int abs(int x)
    {
        if(x<0)
            return -x;
        return x;
    }
    int DFS(int u)
    {
        for(int i=0;i<vN;i++) if(!visit[i]&&g[u][i])
        {
            visit[i]=1;
            if(match[i]==-1 || DFS(match[i]))
            {
                match[i]=u;
                return 1;
            }
        }
        return 0;
    }
    
    int MaxMatch()
    {
        memset(match,-1,sizeof(match));
        int ans=0;
        for(int i=0;i<uN;i++)
        {
            memset(visit,0,sizeof(visit));
            if(DFS(i)) ans++;
        }
        return ans;
    }
    
    void input()
    {
        scanf("%d", &n);
        uN = vN = 0;
        for (int i = 0; i < n; i++)
        {
            int a;
            char sex[3];
            scanf("%d%s", &a, sex);
            if (sex[0] == 'M')
            {
                male[uN].h = a;
                scanf("%s%s", male[uN].music, male[uN].sport);
                uN++;
            }
            else
            {
                female[vN].h = a;
                scanf("%s%s", female[vN].music, female[vN].sport);
                vN++;
            }
        }
    }
    
    bool couple(int a, int b)
    {
        if (abs(male[a].h - female[b].h) > 40)
            return false;
        if (strcmp(male[a].music, female[b].music))
            return false;
        if (strcmp(male[a].sport, female[b].sport) == 0)
            return false;
        return true;
    }
    
    void make()
    {
        memset(g, 0, sizeof(g));
        for (int i = 0; i < uN; i++)
            for (int j = 0; j < vN; j++)
                if (couple(i, j))
                    g[i][j] = true;
    }
    
    int main()
    {
        int t;
        scanf("%d", &t);
        while (t--)
        {
            input();
            make();
            printf("%d
    ", n - MaxMatch());
        }
        return 0;
    }
  • 相关阅读:
    NodeJs 的Module.export 和 export
    Angular 调试
    设计模式 -- 访问者
    typescript 枚举
    Swagger 实践 <二>
    eventFlow 系列 <三> 查询所有
    成员变量的隐藏和方法的重写
    Facetoprocess_program_design
    ATM_tests
    transmission protocol
  • 原文地址:https://www.cnblogs.com/yongren1zu/p/3232766.html
Copyright © 2020-2023  润新知