概念
拓扑序代表了元素之间的条件关系,拓扑排序就是用有向图无环来存储关系并求出序列。
实现
直接邻接表存图,当某个点入度为0,就记录并删掉与它相连的边。
优先队列确保字典序最小。
#include <bits/stdc++.h>
using namespace std;
const int M=1e6*5+5;
vector<int> G[M];
priority_queue<int,vector<int>,greater<int> > q;
int a[M],In_Degree[M];
int n,m,cnt;
void add(int U,int V){
In_Degree[V]++;
G[U].push_back(V);
}
void Top_Sort(){
for(int i=1;i<=n;i++){
if(In_Degree[i]==0) q.push(i);
}
while(!q.empty()){
int p=q.top();q.pop();
a[++cnt]=p;
int siz=G[p].size();
for(int i=0;i<siz;i++){
int v=G[p][i];
In_Degree[v]--;
if(In_Degree[v]==0) q.push(v);
}
}
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1,x,y;i<=m;i++){
scanf("%d %d",&x,&y);
add(x,y);
}
Top_Sort();
if(cnt!=n) printf("no solution\n");
else {
for(int i=1;i<=cnt;i++){
printf("%d ",a[i]);
}
}
return 0;
}