1.什麼是拓撲排序node
拓撲排序就是對有向無環圖(DAG)上的一些點的編號進行排序,使得圖中每條邊的起點都比終點的位置要靠前c++
算法
spa
3d
好比這個圖code
咱們發現點1入度爲0,因此分離點1,並對其餘點的入度進行調整blog
此時咱們發現點2和4入度爲0,那麼咱們先分離點2,調整入度排序
繼續分離隊列
有環的狀況:it
咱們發現不管如何都沒有點的入度爲1,此時拓撲序無解
代碼:
#include<bits/stdc++.h> using namespace std; const int MAXN=9999999; int head[MAXN],to[MAXN],nxt[MAXN],in[MAXN],cnt; int ans[MAXN],nodecnt; inline void add(int u,int v) { cnt++; to[cnt]=v; nxt[cnt]=head[u]; head[u]=cnt; } int n,m; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int start,end; scanf("%d%d",&start,&end); add(start,end); in[end]++; } priority_queue<int,vector<int>,greater<int> > q; for(int i=1;i<=n;i++) { if(!in[i]) q.push(i); } while(!q.empty()) { int top=q.top(); q.pop(); ans[++nodecnt]=top; for(int e=head[top];e;e=nxt[e]) { in[to[e]]--; if(!in[to[e]]) q.push(to[e]); } } if(nodecnt!=n) printf("No Solution"); else { for(int i=1;i<=nodecnt;i++) { printf("%d ",ans[i]); } } }