UVA 12083 Guardian of Decency(最小獨立集)

最大獨立集=點數-最大匹配。
#include<iostream>
#include<cstring>
using namespace std;
const int maxn=500+5;
bool line[maxn][maxn],used[maxn];
int match[maxn],n;
string sex[maxn],music[maxn],sport[maxn];
int h[maxn];
bool find(int i)
{
    for(int j=1;j<=n;j++)
    {
        if(line[i][j]==true&&used[j]==false)
        {
            used[j]=true;
            if(match[j]==-1||find(match[j]))
            {
                match[j]=i;
                return true;
            }
        }
    }
    return false;
}
bool ok(int i,int j)
{
    if(abs(h[i]-h[j])>40) return false;
    if(sex[i]==sex[j]) return false;
    if(music[i]!=music[j]) return false;
    if(sport[i]==sport[j]) return false;
    return true;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        memset(line,false,sizeof(line));
        memset(match,-1,sizeof(match));
        scanf("%d",&n);
        for(int i=1;i<=n;i++) {cin>>h[i]>>sex[i]>>music[i]>>sport[i];}
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(i==j) continue;
                if(ok(i,j)) {line[i][j]=true;}
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++){
            memset(used,false,sizeof(used));
            if(find(i)) ans+=1;
        }
        printf("%d\n",n-ans/2);
    }
    return 0;
}

發佈了690 篇原創文章 · 獲贊 5 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章