拓扑排序针对的是有向无环图,可以输出一个起点一定在终点前面的序列
核心思想就是先将入都为0的点先存入队列,然后再每次出队一个点,把他的所边的终点入度减一,如果这个点入度也为0了,那就加入队列,如果最后队列中只有n个元素就是对的
#include<iostream>using namespace std;struct Edge{ int to,next;}edge[10000];int head[10000],cnt;int hh=1,tt=0,q[10010],into[10010];//into记录入度void add_edge(int from,int to){ edge[++cnt].to=to; edge[cnt].next=head[from]; head[from]=cnt;}void topsort(){ for(int i=1;i<=n;i++){ if(!into[i]) q[++tt]=i; } while(tt>=hh){ int now=q[hh++]; for(int i=head[now];i;i=edge[i].next){ int j=edge[i].to; into[j]--; if(into[j]==0) q[++tt]=j; } }}int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int u,v; cin>>u>>v; into[v]++; add_edge(u,v); } topsort(); if(tt=n){ for(int i=1;i<=n;i++){ cout<<q[i]<<' ';