#include<bits/stdc++.h> usingnamespace std; constint LEN = 1e3 + 50; // arr记录摄像头的位置,is判断当前位置是不是摄像头所在 int n, tot, cnt, head[LEN], ind[LEN], arr[LEN]; bool is[LEN]; queue<int> q;
structedge { int nxt_, to_; } e[LEN * LEN];
voidadd(int u, int v){ e[tot].nxt_ = head[u], e[tot].to_ = v; head[u] = tot++; }
voidtoposort(){ for (int i = 1; i <= n; ++i) { if (ind[arr[i]] == 0) { q.emplace(arr[i]); } } while (!q.empty()) { int u = q.front(); q.pop(); ++cnt; for (int i = head[u]; ~i; i = e[i].nxt_) { int v = e[i].to_; // 入度为0的摄像头才加入队列,不是摄像头没有意义呀 if (is[v] && --ind[v] == 0) q.emplace(v); } } }
intmain(){ // 链式前向星存储有向边 memset(head, -1, sizeof(head)); int u, v, m; cin >> n; for (int i = 1; i <= n; ++i) { cin >> u; is[arr[i] = u] = true; cin >> m; for (int j = 1; j <= m; ++j) { cin >> v; ++ind[v]; add(u, v); } } toposort(); cnt == n ? cout << "YES" : cout << n - cnt; }