拓扑排序

简介: 输入:一个有向图 输出:顶点的拓扑序列   具体流程: (1) 将所有入度为0的点加入队列 (2) 每次取出队首顶点 (3) 删除其连出的边,检查是否有新的入度为0的顶点,有则加入队列 (4) 重复(2)直到队列为空 样例输入 5 5 0 1 1 0 2 1 1 2 ...

输入:一个有向图

输出:顶点的拓扑序列


 

具体流程:

(1) 将所有入度为0的点加入队列

(2) 每次取出队首顶点

(3) 删除其连出的边,检查是否有新的入度为0的顶点,有则加入队列

(4) 重复(2)直到队列为空


样例输入

5 5
0 1 1
0 2 1
1 2 1
2 3 1
4 2 1


样例输出


0 4 1 2 3



 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 
 5 int ** edges;
 6 int * in_degrees;
 7 int * out_degrees;
 8 int v,e;
 9 
10 void topSort(){
11     queue<int> q;
12     for(int i=0;i<v;i++){
13         if(0 == in_degrees[i]){
14             q.push(i);
15         }
16     }
17     while(!q.empty()){
18         int front = q.front();
19         q.pop();
20         printf("%d ",front);
21         for(int j=0;j<v;j++){
22             if(edges[front][j]!=0){
23                 edges[front][j] = 0;
24                 in_degrees[j]--;
25                 if(0 == in_degrees[j]){
26                     q.push(j);
27                 }
28             }
29         }
30         
31     }
32 }
33 
34 int main(void){
35     cin>>v>>e;
36     //init
37     edges = new int*[v];
38     in_degrees = new int[v];
39     out_degrees = new int[v];
40     memset(in_degrees,0,v*sizeof(int));
41     memset(out_degrees,0,v*sizeof(int));
42     int i;
43     for(i=0;i<v;i++){
44         edges[i] = new int[v];
45         memset(edges[i],0,v*sizeof(int));
46     }
47     
48 
49 
50     //input
51     for(i=0;i<e;i++){
52         int a,b,w;
53         cin>>a>>b>>w;
54         edges[a][b] = w;        //从a到b有一条路
55         in_degrees[b]++;        //b的入度加1
56         out_degrees[a]++;        //a的出度加1
57     }
58 
59     topSort();
60 
61     //huishou
62     for(i=0;i<v;i++){
63         delete edges[i];
64     }
65     delete edges;
66     delete in_degrees;
67     delete out_degrees;
68     return 0;
69 }

 



 

目录
相关文章
|
6月前
拓扑排序
拓扑排序
43 0
|
6月前
|
NoSQL 容器 消息中间件
图、图的遍历及图的拓扑排序
图、图的遍历及图的拓扑排序
|
6月前
|
存储 人工智能 算法
【算法总结】拓扑排序
【算法总结】拓扑排序
56 0
|
搜索推荐
|
人工智能 自然语言处理 搜索推荐
拓扑排序算法
拓扑排序算法
135 0
|
存储 算法 Java
【数据结构与算法】有向图的拓扑排序
【数据结构与算法】有向图的拓扑排序
203 1
【数据结构与算法】有向图的拓扑排序
拓扑排序(邻接表实现)
拓扑排序(邻接表实现)
183 0
拓扑排序(邻接表实现)
|
机器学习/深度学习 存储
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
图的遍历 无向图深搜 宽搜
拓扑排序-Kitchen Plates
J. Kitchen Plates time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output
122 0
拓扑排序-Kitchen Plates