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");
  }
}