ICPC 模擬国内2005F Gather the Maps AOJ 2011
解法は自明なので書きません
setを乱用すれば簡単に解ける
#include <bits/stdc++.h> using namespace std; int n; bool day[35][55]; int main(){ while(true){ cin >> n; if(n == 0)break; for(int i = 1;i <= n;i++){ int f; cin >> f; for(int j = 0;j < 33;j++)day[j][i] = false; for(int j = 0;j < f;j++){ int tmp; cin >> tmp; day[tmp][i] = true; } } set<int> s[33][55]; for(int i = 1;i <= n;i++)s[0][i].insert(i); int ans = -1; for(int i = 1;i <= 30;i++){ for(int j = 1;j <= n;j++){ for(auto itr = s[i-1][j].begin(); itr != s[i-1][j].end(); ++itr){ s[i][j].insert(*itr); } } set<int> tmps; for(int j = 1;j <= n;j++){ if(day[i][j] == false)continue; for(auto itr = s[i][j].begin(); itr != s[i][j].end();++itr){ tmps.insert(*itr); } } if(tmps.size() == n){ ans = i; break; } for(int j = 1;j <= n;j++){ if(day[i][j] == false)continue; for(auto itr = tmps.begin();itr != tmps.end();++itr){ s[i][j].insert(*itr); } } } cout << ans << endl; } }