码迷,mamicode.com
首页 > 编程语言 > 详细

拓扑排序

时间:2020-03-07 10:13:03      阅读:75      评论:0      收藏:0      [点我收藏+]

标签:序列   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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!