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