https://www.luogu.com.cn/problem/P2712
可以看出是拓扑排序,因为是有前后关系的,但是坑点在于点并不连续,值得记录一下(刚开始70分,后来才AC)
注意坑点:拓扑排序,遍历的点不连续
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; int n, x, m, y, d[N], cnt=0, vis[N], Max=0; vector<int> a[N]; queue<int> q; int main() { scanf("%d", &n); for (int i=1; i<=n; i++) { scanf("%d%d", &x, &m); vis[x]=1; //有这个点 for (int j=1; j<=m; j++) { scanf("%d", &y); a[x].push_back(y); d[y]++; } Max=max(x, Max); //最大点数 } for (int i=1; i<=Max; i++) //因为不连续,所以要用Max记录最大点数 if (d[i]==0 && vis[i]) q.push(i); //有这个点,才可以用 while (!q.empty()) { int u=q.front(); q.pop(); // cout<<u<<endl; if (vis[u]) cnt++; //有这个点 for (int i=0; i<a[u].size(); i++) { int v=a[u][i]; d[v]--; if (d[v]==0) q.push(v); } } if (cnt<n) printf("%d", n-cnt); //求的是还没砸掉的摄像头的数量 else printf("YES"); return 0; }
标签:洛谷,P2712,int,题解,坑点,摄像头 From: https://www.cnblogs.com/didiao233/p/17990512