算法系列之图--拓扑排序

  本文介绍使用深度先搜索对向无环图(DAG)进行拓扑排序。

  对于一个有向无环图G=(V,E)来说,其拓扑排序是G中所有结点的一种线性次序,该次序满足如下条件:如果G包含边(u,v)则结点u在拓扑排序中处于结点v的前面(若图G包含一个环路则不可能排出一个线性次序)。可将图中的拓扑排序看成是将图的所有结点在一条水平线上排开,图中所有边都从左指向右。

  给一个拓扑图如下示:

  

  拓扑排序算法与DFS相似,但是在拓扑排序的过程中,每个结点都是后与其临接链表里的结点而放入Stack中。

  具体代码如下示:

  

 1 #include <iostream>
 2 #include <list>
 3 #include <stack>
 4 using namespace std;
 5
 6 //拓扑排序里的图应该是有向无环图
 7 class DAG{
 8 private:
 9     int v;
10     list<int> *adj;
11     void topologicalSortUtil(int v,bool *visited,stack<int>& Stack);
12 public:
13     DAG(int v);//ctor
14     void addEdge(int start,int end);//DAG中是有向图
15     void topologicalSort();
16 };
17
18 DAG::DAG(int v){
19     this->v = v;
20     adj = new list<int>[v];
21 }
22
23 void DAG::addEdge(int start,int end){
24     adj[start].push_back(end);
25 }
26
27 void DAG::topologicalSortUtil(int v,bool* visited,stack<int>& Stack){
28     visited[v] = true;
29
30     list<int>::iterator beg = adj[v].begin();
31     for (;beg != adj[v].end();++beg)
32         if (visited[*beg] == false)
33             topologicalSortUtil(*beg,visited,Stack);
34     Stack.push(v);
35 }
36
37 void DAG::topologicalSort(){
38     stack<int> Stack = stack<int>();
39     bool *visited = new bool[v];
40     for (int i=0;i<v;i++)
41         visited[i] = false;
42
43     //recursive call tsutil function to store TopoligicalSort
44     //one by one
45     for (int i=0;i<v;i++)
46         if (visited[i] == false)
47             topologicalSortUtil(i,visited,Stack);
48
49     while(!Stack.empty()){
50         cout<<Stack.top()<<" ";
51         Stack.pop();
52     }
53 }
54
55 int main(){
56     DAG dag = DAG(9);
57     dag.addEdge(1,6);
58     dag.addEdge(2,3);
59     dag.addEdge(3,6);
60     dag.addEdge(4,0);
61     dag.addEdge(4,1);
62     dag.addEdge(5,2);
63     dag.addEdge(5,0);
64     dag.addEdge(5,1);
65     dag.addEdge(7,8);
66
67     cout<<"Topological Sort of the given Directed Acyclic Graph(DAG): "<<endl;
68     dag.topologicalSort();
69     cout<<endl;
70
71     return 0;
72 }

运行结果为:

文献引用:算法导论->22.4拓扑排序

代码参考:http://www.geeksforgeeks.org/topological-sorting/

时间: 2024-10-18 15:08:23

算法系列之图--拓扑排序的相关文章

[算法小练][图][拓扑排序+深度优先搜索] 平板涂色问题

说在前面 本题是一道经典题目,多做经典题目可以节省很多学习时间,比如本题就包含了许多知识:回溯+剪枝+拓扑排序+深度优先搜索.[动态规划方法另作讨论] 关键代码 题: CE数码公司开发了一种名为自动涂色机(APM)的产品.它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色. 为了涂色,APM需要使用一组刷子.每个刷子涂一种不同的颜色C.APM拿起一把有颜色C的刷子,并给所有颜色为C且符合下面限制的矩形涂色: 为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂

数据结构:图--拓扑排序

拓扑排序 拓扑排序 在实际应用中,有向图的边可以看做是顶点之间制约关系的描述.把顶点看作是一个个任务,则对于有向边<Vi,Vj>表明任务Vj的完成需等到任务Vi完成之后,也就是说任务Vi先于任务Vj完成.对于一个有向图,找出一个顶点序列,且序列满足:若顶点Vi和Vj之间有一条边<Vi,Vj>,则在此序列中顶点Vi必在顶点Vj之前.这样的一个序列就称为有向图的拓扑序列(topological order). 步骤 从有向图中选取一个没有前驱(入度为0)的顶点输出. 删除图中所有以它为

HDU4857——逃生(反向建图+拓扑排序)

逃生 Description 糟糕的事情发生啦,现在大家都忙着逃命.但是逃命的通道很窄,大家只能排成一行. 现在有n个人,从1标号到n.同时有一些奇怪的约束条件,每个都形如:a必须在b之前.同时,社会是不平等的,这些人有的穷有的富.1号最富,2号第二富,以此类推.有钱人就贿赂负责人,所以他们有一些好处.负责人现在可以安排大家排队的顺序,由于收了好处,所以他要让1号尽量靠前,如果此时还有多种情况,就再让2号尽量靠前,如果还有多种情况,就让3号尽量靠前,以此类推.那么你就要安排大家的顺序.我们保证一

算法系列(四)排序算法下篇--如何超越排序算法下界

概述 在算法系列(四)排序算法中篇--归并排序和快速排序一文中,我们介绍了归并排序和快速排序,最坏的情况下,最快的排序算法的时间复杂度是O(nlogn),是否有更好的算法呢?到目前为止,没有特殊的规则,O(nlogn)已经是最好的排序算法了,也就是说通用排序算法的时间复杂度下界就是O(nlogn).如果限定一些规则,是可以打破这个下界的.下面说一下尽在O(n)时间内就能实现对数组排序的算法. 基于排序的规则 基于什么样的规则才能突破排序的下界呢?我们需要分析一下排序消耗的时间.排序需要遍历,比较

算法系列笔记6(有关图的算法一—搜索,拓扑排序和强连通分支)

简单概念:对于图G(V,E),通常有两种存储的数据结构,一种是邻接矩阵,此时所需要的存储空间为O(V^2):第二种是邻接表,所需要的存储空间为O(V+E).邻接表表示法存在很强的适应性,但是也有潜在的不足,当要快速的确定图中边(u,v)是否存在,只能在顶点u的邻接表中搜索v,没有更快的方法,此时就可以使用邻接矩阵,但要以占用更多的存储空间作为代价:此外当图不是加权的,采用邻接矩阵存储还有一个优势:在存储邻接矩阵的每个元素时,可以只用一个二进位,而不必用一个字的空间. 图的搜索算法 搜索一个图示有

算法导论22.4拓扑排序 练习总结 (转载)

22.4-1 给出算法 TOPOLOGICAL-SORT 运行于图 22-8 上时所生成的结点次序.这里的所有假设和练习 22.3-2 一样. ANSWER:   22.4-2 请给出一个线性时间的算法,算法的输入为一个有向无环图 G = (V, E) 以及两个结点 s 和 t,算法的输出是从结点 s 到结点 t 之间的简单路径的数量.例如,对于图 22-8 所示的有向无环图,从结点 p 到结点 v 一共有 4 条简单路径,分别是 pov.poryv.posryv 和 psryv.(本题仅要求计

图-&gt;有向无环图-&gt;拓扑排序

文字描述 关于有向无环图的基础定义: 一个无环的有向图称为有向无环图,简称DAG图(directed acycline graph).DAG图是一类较有向树更一般的特殊有向图. 举个例子说明有向无环图的应用.假如有一个表达式: ((a+b)*(b*(c+d))+(c+d)*e)*((c+d)*e), 可以用之前讨论的二叉树来表示,也可以用有向无环图来表示,如下图.显然有向无环图实现了对相同子式的共享,从而比二叉树更节省空间. 关于拓扑排序的基础定义: 由某个集合上的一个偏序得到该集合上的一个全须

算法详解之拓扑排序

名词解释 ·(点的)度:对于无向图,和某个点相连的边条数 ·入度:对于有向图,终点是该点的边条数 ·出度:对于有向图,起点是该点的边条数 ·(两点间)路径:从起点点依次沿着边移动到下一个点,直到终点所经过的点和/或边若未有向图要求只能从边的起点移动到边的终点 ·圈:从一个点出发到自己的路径,常常被称作环 ·有向无环图(DAG):不含有环的有向图 拓扑排序 ·和数组的排序没什么关系 ·对DAG的顶点进行排序,结果要求 每个顶点出现且仅出现一次 对于顶点对(u,v),若排序后u在v前,则不存在v到u

数据结构与算法系列十三(选择排序)

1.引子 1.1.为什么要学习数据结构与算法? 有人说,数据结构与算法,计算机网络,与操作系统都一样,脱离日常开发,除了面试这辈子可能都用不到呀! 有人说,我是做业务开发的,只要熟练API,熟练框架,熟练各种中间件,写的代码不也能“飞”起来吗? 于是问题来了:为什么还要学习数据结构与算法呢? #理由一: 面试的时候,千万不要被数据结构与算法拖了后腿 #理由二: 你真的愿意做一辈子CRUD Boy吗 #理由三: 不想写出开源框架,中间件的工程师,不是好厨子 1.2.如何系统化学习数据结构与算法?