AOJ 2011 Gather the Maps!

問題

(http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2011)

解法

詳しくはhttp://www.deqnotes.net/acmicpc/p0017/

コード

````cpp int m[64][64], in[64][32];

int main(){ int n, f, day; while(scanf("%d", &n) && n){ memset(m, 0, sizeof(m)); memset(in, 0, sizeof(in));

rep(i, n){
  scanf("%d", &f);
  rep(j, f){
scanf("%d", &day);
in[i][day] = 1;
  }
  m[i][i] = 1;
}

REP(d, 1, 31){
  set<int>s;
  rep(i, n){
if(!in[i][d]) continue;
rep(j, n) if(m[i][j]) s.insert(j);
  }
  rep(i, n){
if(!in[i][d]) continue;

for(set<int>::iterator it = s.begin(); it != s.end(); it++) m[i][*it] = 1;
  }

  if(s.size() == n){
printf("%d\n", d);
goto e;
  }
}
printf("-1\n");

e:; } return 0; }