二分图匹配-匈牙利算法
#include <iostream> #include <vector> #include <cstdio> #define N 100005 using namespace std; int n; vector<int> g[N]; int match[N]; bool used[N]; void addEdge(int a,int b) { g[a].push_back(b); //g[b].push_back(a); } bool dfs(int v) { used[v]=true; for(int i=0;i<g[v].size();i++) { int u=g[v][i],w=match[u]; if(w<0||(!used[w]&&dfs(w))) { match[u]=v; match[v]=u; return true; } } return false; } int main(int argc, const char * argv[]) { while(scanf("%d",&n)!=EOF) { int a,p,b; for(int j=0;j<n;j++) { g[j].clear(); scanf("%d: (%d)",&a,&p); for(int i=0;i<p;i++) scanf("%d",&b),addEdge(a,b); } fill(match,match+n,-1); int ans=0; for(int i=0;i<n;i++) { if(match[i]<0) { fill(used,used+n,false); if(dfs(i)) ans++;//匹配对数 } } printf("%d\n",n-ans); } return 0; }