#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <string.h>
#include <queue> //poj1466 二分图最大独立集
#define N 510
using namespace std;
int a[N][N], use[N], vis[N];
int n;
/*
二分图最大独立集=顶点数-二分图最大匹配
独立集:图中任意两个顶点都不相连的顶点集合。(一边的集合)
*/
bool dfs(int x)
{
int t;
for(t=0; t<n; ++t)
{
if(a[x][t]&&!vis[t])
{
vis[t]=1;
if(use[t]==-1||dfs(use[t]))
{
use[t]=x;
return true;
}
}
}
return false;
}
int main()
{
int i, t, j, k, s;
while(scanf("%d", &n)!=EOF)
{
memset(use, -1, sizeof(use));
memset(a, 0, sizeof(a));
for(i=0; i<n; ++i)
{
scanf("%d: (%d)", &k, &j);
while(j--)
{
scanf("%d", &t);
a[k][t]=1;
}
}
for(t=s=0; t<n; ++t)
{
memset(vis, 0, sizeof(vis));
if(dfs(t))
s++;
}
printf("%d\n", n-s/2); //这里的s是两倍的边,3--4, 4---3只能算一条边,而计算出是两条边
}
return 0;
}
poj1466 二分图最大独立集
最新推荐文章于 2021-10-26 20:31:08 发布