一、简介
在有向无环图中,若一个由图中所有点构成的序列 A A A满足:对于图中所有边 ( x , y ) (x,y) (x,y), x x x在 A A A中都出现在 y y y之前,则称 A A A是该图的拓扑排序。
二、应用
- 当队列queue中的长度小于点数,则图中存在环。
三、Code
/*
* @Author: NEFU_马家沟老三
* @LastEditTime: 2020-09-13 08:37:20
* @CSDN blog: https://blog.csdn.net/acm_durante
* @E-mail: 1055323152@qq.com
* @ProbTitle: 拓扑排序
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = n; i >= a; i--)
#define lowbit(x) ((x) & -(x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
#define mem(a, b) memset(a, b, sizeof(a))
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
const double PI = acos(-1.0);
const int N = 1e5+5;
int head[N], a[N], deg[N],cnt = 0;
struct node
{
int v,next;
}e[N];
void add(int u,int v){
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
deg[v]++;//入度
}
void topsort(int n,int m){
queue<int>q;
rep(i,1,n)
if(!deg[i]) q.push(i);
while (!q.empty())
{
int u = q.front();
q.pop();
a[++cnt] = u;
for(int i = head[u]; ~i; i = e[i].next){
int v = e[i].v;
if(--deg[v] == 0)
q.push(v);
}
}
}
int main()
{
int n, m;//n点数,m边数
mem(head,-1);
cin >> n >> m;
rep(i,1,n){
int u, v;
cin >> u >> v;
add(u,v);
}
topsort(n,m);
rep(i,1,cnt){
cout << a[i] << ' ';
}
cout << "\n";
return 0;
}