求二分图的最大独立集,其等于图的点数-最大匹配数
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=501;
int n,p[maxn];
vector<int> e[maxn];
bool vis[maxn];
bool DFS(int u)
{
for(int i=0;i<e[u].size();i++)
{
if(!vis[e[u][i]])
{
vis[e[u][i]]=1;
if(p[e[u][i]]==-1||DFS(p[e[u][i]]))
{
p[e[u][i]]=u;
return 1;
}
}
}
return 0;
}
void hungary()
{
int ans=0;
for(int i=0;i<n;i++)
{
memset(vis,0,sizeof(vis));
if(DFS(i))
ans++;
}
printf("%d\n",n-(ans>>1));
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<=n;i++)
e[i].clear();
memset(p,-1,sizeof(p));
for(int i=0;i<n;i++)
{
int u,m,v;
scanf("%d: (%d)",&u,&m);
for(int j=0;j<m;j++)
{
scanf("%d",&v);
e[u].push_back(v);
e[v].push_back(u);
}
}
hungary();
}
return 0;
}