题意:二分图求最大独立点集。
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1137
——>>匈牙利算法直接A……最大独立点集的元素个数 = 总元素个数 - 最大匹配数(开始做的时候总输不对样例的结果,原来题意理解反了,是求最大独立点集,而不是最大匹配数,Enhlish……)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
const int maxn = 10000 + 10;
vector<int> G[maxn];
int fa[maxn];
bool vis[maxn];
bool dfs(int u)
{
int d = G[u].size();
for(int i = 0; i < d; i++)
{
int v = G[u][i];
if(!vis[v])
{
vis[v] = 1;
int temp = fa[v];
fa[v] = u;
if(temp == -1 || dfs(temp)) return 1;
fa[v] = temp;
}
}
return 0;
}
int main()
{
int n, i, u, v, cnt;
while(~scanf("%d", &n))
{
for(i = 0; i < maxn; i++) G[i].clear();
for(i = 0; i < n; i++)
{
scanf("%d: (%d)", &u, &cnt);
while(cnt--)
{
scanf("%d", &v);
G[u].push_back(v);
G[v].push_back(u);
}
}
memset(fa, -1, sizeof(fa));
for(i = 0; i < n; i++)
{
memset(vis, 0, sizeof(vis));
dfs(i);
}
int sum = 0;
for(i = 0; i < n; i++) if(fa[i] != -1) sum++;
printf("%d\n", n-sum/2);
}
return 0;
}