最简单的二分图匹配,第一次写增广路算法。 #include<iostream> using namespace std; const int MAX=205; bool map[MAX][MAX]; int match[MAX]; bool vis[MAX]; int n,m; bool can(int t) { for(int i=1;i<=m;i++) { if(map[t][i] && 0==vis[i]) { vis[i]=1; if(match[i]==-1 || can(match[i])) { match[i]=t; return true; } } } return false; } int main() { freopen("in.txt","r",stdin); while(cin>>n>>m) { memset(map,0,sizeof(map)); int k; for(int i=1;i<=n;i++) { cin>>k; for(int j=1;j<=k;j++) { int x; cin>>x; map[i][x]=1; } } memset(match,-1,sizeof(match)); int ans=0; for(int i=1;i<=n;i++) { memset(vis,0,sizeof(vis)); if(can(i)) ans++; } cout<<ans<<endl; } return 0; }