原题:http://acm.hdu.edu.cn/showproblem.php?pid=1068
题意:
给定一些男女生之间的暧昧关系,求一个最大的集合,使得集合中相互之间没有暧昧关系;
思路:
就是求最大独立集,最大独立集 = 顶点数 - 最大匹配;
#include<stdio.h>
#include<vector>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1500;
int lef[maxn];
bool T[maxn];
int n;
vector<int>G[maxn];
bool match(int x)
{
for(int i = 0;i<G[x].size();i++)
{
int v = G[x][i];
if(!T[v])
{
T[v] = true;
if(lef[v] == -1 || match( lef[v] ))
{
lef[v] = x;
return true;
}
}
}
return false;
}
int solve()
{
memset(lef, -1, sizeof(lef));
int ans = 0;
for(int i = 0;i<n;i++)
{
memset(T, 0, sizeof(T));
if( match(i) )
ans++;
}
return ans;
}
int main()
{
while(scanf("%d", &n)!=EOF)
{
int m, k;
for(int i = 0;i<n;i++)
G[i].clear();
for(int i = 0;i<n;i++)
{
scanf("%d: (%d)", &m, &k);
for(int j = 0;j<k;j++)
{
int x;
scanf("%d", &x);
G[i].push_back(x);
}
}
int ans = solve();
printf("%d\n", n-ans/2);
}
return 0;
}