給定一個n個點m條邊的有向圖,圖中可能存在重邊和自環。
請輸出任意一個該有向圖的拓撲序列,如果拓撲序列不存在,則輸出-1。
若一個由圖中所有點構成的序列A滿足:對於圖中的每條邊(x, y),x在A中都出現在y之前,則稱A是該圖的一個拓撲序列。
輸入格式
第一行包含兩個整數n和m
接下來m行,每行包含兩個整數x和y,表示點x和點y之間存在一條有向邊(x, y)。
輸出格式
共一行,如果存在拓撲序列,則輸出拓撲序列。
否則輸出-1。
數據范圍
1≤n,m≤1051≤n,m≤105
輸入樣例:
3 3
1 2
2 3
1 3
輸出樣例:
1 2 3
算法:bfs
#include<iostream> #include<queue> #include<algorithm> #include<cstring> #include<vector> using namespace std; const int N=100010; int n, m, idx; queue<int>q,p; int h[N],e[N],ne[N],d[N]; vector<int>res; void add(int a, int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } bool top_sort(){ for(int i=1;i<=n;i++) if(!d[i])q.push(i); while(q.size()){ int t=q.front(); res.push_back(t); q.pop(); for(int i=h[t];~i;i=ne[i]){ int j=e[i]; if(--d[j]==0){ q.push(j); } } } return res.size()==n; } int main(void){ cin>>n>>m; memset(h,-1,sizeof(h)); for(int i=0,a,b;i<m;i++){ cin>>a>>b; add(a,b); d[b]++; } if(top_sort()){ for(int i=0;i<n;i++)cout<<res[i]<<' '; } else cout<<"-1"<<endl; return 0; }