PKU 1469 COURSES
http://poj.org/problem?id=1469
p個の講座?があって、n人の生徒がいる。
それぞれの講座に出席している生徒のリストが与えられたときに、以下の条件をみたすようにp人の委員を決めたい。
・それぞれの生徒は、異なる講座を代表するものであり、
・全ての講座は代表者を持つ。
そのような構成が可能かどうかを判定しろというような問題。
生徒と講座の最大二部グラフマッチング。
p個のマッチングできればよい。
以下のコードは変数n,pが逆になってしまってますね。
vector<int> G[400]; bool vis[400]; int match[400]; bool augment(int u){ vis[u]=true; rep(i,SZ(G[u])){ if(match[G[u][i]]==-1){ match[G[u][i]]=u; match[u]=G[u][i]; return true; } if(!vis[match[G[u][i]]] && augment(match[G[u][i]])){ match[G[u][i]]=u; match[u]=G[u][i]; return true; } } return false; } main(){ int T; scanf("%d",&T); while(T--){ int n,p; scanf("%d%d",&n,&p); rep(i,n+p)G[i].clear(); rep(i,n){ int co; scanf("%d",&co); rep(j,co){ int t; scanf("%d",&t); --t; G[i].pb(t+n); G[t+n].pb(i); } } memset(match,-1,sizeof(match)); int num=0; rep(i,n){ if(match[i]!=-1)continue; memset(vis,0,sizeof(vis)); if(augment(i))++num; } puts(num==n?"YES":"NO"); } }