拓扑排序
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
const int N = 105;
int ind[N] = {0};
int n;
vector<int> G[N];
bool topsort(){
int cnt = 0;
queue<int> q;
for(int i = 1; i <= n; i++){
if(!ind[i]) q.push(i);
}
while(q.size()){
int t = q.front();
q.pop();
cnt++;
for(int j = 0; j < G[t].size(); j++){
int v = G[t][j];
ind[v]--;
if(!ind[v]) q.push(v);
}
}
if(cnt == n) return 1;
else return 0;
}
int main(){
int x, k;
scanf("%d", &n);
for(int i = 1; i <= n; i++){
scanf("%d", &k);
ind[i] = k;
while(k--){
scanf("%d", &x);
G[x].push_back(i);
}
}
if(topsort()) puts("1");
else puts("0");
return 0;
}