标签:序列 bsp lse space nbsp 拓扑排序 ++ end sort
# 题意
给定n点m边的有向图,可能存在重边,输出任意一个这个图的拓扑序列,如果不存在输出-1
# 题解
有向无环图是拓扑排序的关键
bfs,选择入度为0的点,不断的将入度为0的点加入答案序列,并将它所有出边的终点的度-1
如果存在拓扑序列,那么最后的答案数组长度就是节点个数,如果不存在,即过程进行到某一步后
1 #include <bits/stdc++.h> 2 #define pb push_back 3 using namespace std; 4 const int N=1e5+10; 5 int n,m; 6 int h[N],e[N],ne[N],idx; 7 int d[N]; 8 int ans[N],cnt; 9 void add(int a,int b){ 10 e[idx]=b,ne[idx]=h[a],h[a]=idx++; 11 d[b]++; 12 } 13 bool topsort(){ 14 queue<int>q; 15 for(int i=1;i<=n;i++) 16 if(d[i]==0) 17 q.push(i); 18 while(q.size()){ 19 int x=q.front(); 20 q.pop(); 21 ans[++cnt]=x; 22 for(int i=h[x];i!=-1;i=ne[i]){ 23 int y=e[i]; 24 if(--d[y]==0) q.push(y); 25 } 26 } 27 return cnt==n?1:0; 28 } 29 int main(){ 30 cin>>n>>m; 31 memset(h,-1,sizeof h); 32 while(m--){ 33 int a,b; 34 cin>>a>>b; 35 add(a,b); 36 } 37 if(topsort()) { 38 for (int i = 1; i <= cnt; i++) 39 cout << ans[i] << ‘ ‘; 40 } 41 else 42 cout<<"-1"<<endl; 43 }
标签:序列 bsp lse space nbsp 拓扑排序 ++ end sort
原文地址:https://www.cnblogs.com/hhyx/p/12432212.html