拓扑排序
2026-03-21 03:55:57
发布于:广东
11阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll edge[510], a[510];
vector<ll> ve[510];
ll n, ans;
bool v[510];
queue<ll> q;
int main()
{
cin >> n;
for (int i = 1; i <= n; i++) {
ll m, y;
cin >> a[i];
cin >> m;
v[a[i]] = 1; // 记录a[i]处有摄像头
for (int j = 1; j <= m; j++) {
cin >> y;
if(a[i]==y) continue;//避免自环
ve[a[i]].push_back(y);
edge[y]++;
}
}
for (int i = 1; i <= n; i++) {
if (!edge[a[i]])
q.push(a[i]); // 加入入度为0节点
}
while (!q.empty()) {
ans++; // 计数器
ll x = q.front();
q.pop(); // 取出队首
for (int i = 0; i < ve[x].size(); i++) {
ll y = ve[x][i];
edge[y]--; // 入度减一
if (!edge[y] && v[y])
q.push(y); // 如果这个地方有摄像头且入度为0
}
}
if (ans == n)
printf("YES\n");
else
printf("%lld\n", n - ans);
return 0;
}
这里空空如也







有帮助,赞一个