求二分图的最大独立集,其等于图的点数-最大匹配数
代码:
#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; }