intさわだんのBlack History

刹那的レジェンドになりたい。

ICPC 模擬国内2005F Gather the Maps AOJ 2011

問題文
judge.u-aizu.ac.jp

解法は自明なので書きません
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;
    }
}