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;
}
原文地址:https://www.cnblogs.com/yongren1zu/p/3232766.html