蓝桥杯
拓扑排序文章:
https://www.jianshu.com/p/3347f54a3187
https://blog.csdn.net/qq_41713256/article/details/80805338
https://www.cnblogs.com/bigsai/p/11489260.html
https://blog.csdn.net/red_red_red/article/details/89842966
#include <cstdio>
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
int visited[100010];
int in_degree[100010];
vector<int> map[100010];
queue<int> q;
//int graph[100010][100010]; //会超时
int N;
void topo()
{
int i, j, k, ans;
for(int i = 1; i <= N; ++i) {
if (in_degree[i] == 1) {
q.push(i);
visited[i] = 1;
}
}
while (!q.empty()) {
int tmp = q.front();
q.pop();
for (int j = 0; j < map[tmp].size(); ++j) {
int now = map[tmp][j];
in_degree[now]--;
if (in_degree[now] == 1) {
q.push(now);
visited[now] = 1;
}
}
}
}
int main()
{
int i, x, y;
scanf("%d", &N);
for (i = 1; i <= N; ++i) {
scanf("%d %d", &x, &y);
map[x].push_back(y);
map[y].push_back(x);
in_degree[x]++;
in_degree[y]++;
}
topo();
for (i = 1; i <= N; ++i) {
if (!visited[i]) {
printf("%d ", i);
}
}
}