拓扑排序详解

拓扑排序看起来很难,其实了解后不算难(思想非常清楚)

关键掌握思想后需要学会应用到具体的题目中去。(从入度为0到出度为0)

1、拓扑排序的介绍

对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。
    拓扑排序对应施工的流程图具有特别重要的作用,它可以决定哪些子工程必须要先执行,哪些子工程要在某些工程执行后才可以执行。为了形象地反映出整个工程中各个子工程(活动)之间的先后关系,可用一个有向图来表示,图中的顶点代表活动(子工程),图中的有向边代表活动的先后关系,即有向边的起点的活动是终点活动的前序活动,只有当起点活动完成之后,其终点活动才能进行。通常,我们把这种顶点表示活动、边表示活动间先后关系的有向图称做顶点活动网(Activity On Vertex network),简称AOV网。
    一个AOV网应该是一个有向无环图,即不应该带有回路,因为若带有回路,则回路上的所有活动都无法进行(对于数据流来说就是死循环)。在AOV网中,若不存在回路,则所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列(Topological order),由AOV网构造拓扑序列的过程叫做拓扑排序(Topological sort)。AOV网的拓扑序列不是唯一的,满足上述定义的任一线性序列都称作它的拓扑序列。

2、拓扑排序的实现步骤

在有向图中选一个没有前驱的顶点并且输出
从图中删除该顶点和所有以它为尾的弧(白话就是:删除所有和它有关的边)
重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。

3、拓扑排序示例手动实现

在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。

先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。

一直做改操作,直到所有的节点都被分离出来。

如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的情况。

下面是算法的演示过程。

4.实现代码(队列):O(V+E)

    queue<int>q;

    vector<int>edge[n];//这里使用了数组的vector数组来表示连接关系,实际上结构体也可以完成此任务

    for(int i=0;i<n;i++)  //n  节点的总数

        if(in[i]==0) q.push(i);  //将入度为0的点入队列

    vector<int>ans;   //ans 为拓扑序列(其实队列也可以完成)

    while(!q.empty())

    {

        int p=q.front(); q.pop(); // 选一个入度为0的点,出队列

        ans.push_back(p);

        for(int i=0;i<edge[p].size();i++)

        {

            int y=edge[p][i];    //y表示的是点p的直接后继结点

            in[y]--;    //入度减1

            if(in[y]==0)    //入度为0的点则需要入队

                q.push(y);  

        }

    }

    if(ans.size()==n)   

    {

        for(int i=0;i<ans.size();i++)

            printf( "%d ",ans[i] );

        printf("\n");

    }

    else printf("No Answer!\n");   //  ans 中的长度与n不相等,就说明无拓扑序列
        

————————————————
参考来源:

https://blog.csdn.net/qq_35644234/article/details/60578189

https://blog.csdn.net/qq_41713256/article/details/80805338

原文地址:https://www.cnblogs.com/xwh-blogs/p/12596250.html

时间: 2024-10-08 06:27:57

拓扑排序详解的相关文章

图论-拓扑排序详解

拓扑排序(topsort)详解 这篇随笔就信息学奥林匹克竞赛中图论的一个知识点--拓扑排序进行讲解.拓扑排序的内容比较基础,只要求读者学习过并了解信息学中图的相关定义和一些专业名词,但是拓扑排序的变形题目比较多,希望读者在看完本随笔后认真体会练习,掌握拓扑排序. 上课! 拓扑排序的定义 顾名思义,这是一种排序,确切地说,是一种图上排序,在一张有向无环图(注解:有向无环图即很多参考书和题解中所说的DAG)上进行排序,把其中的所有节点排成一个序列,使得图中的任意一对有边相连的节点(u,v)u要出现在

转:【拓扑排序详解】+【模板】

转自:http://www.cnblogs.com/skywang12345/p/3711489.html 拓扑排序介绍 拓扑排序(Topological Order)是指,将一个有向无环图(Directed Acyclic Graph简称DAG)进行排序进而得到一个有序的线性序列. 这样说,可能理解起来比较抽象.下面通过简单的例子进行说明! 例如,一个项目包括A.B.C.D四个子部分来完成,并且A依赖于B和D,C依赖于D.现在要制定一个计划,写出A.B.C.D的执行顺序.这时,就可以利用到拓扑

拓扑排序详解与实现

目录 介绍 拓扑排序算法分析 拓扑排序代码实现 @(目录) 介绍 拓扑排序,很多人都可能听说但是不了解的一种算法.或许很多人只知道它是图论的一种排序,至于干什么的不清楚.又或许很多人可能还会认为它是一种啥排序.而实质上它是对有向图的顶点排成一个线性序列. 至于定义,百科上是这么说的: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前.通常

Excel2010排序详解

我倒是要看看这一天一篇的发表频率,能让我自己坚持多长时间. 今天跟大家分享的主要内容是在Excel中的筛选功能,这个功能应该是谁都用过,把一列数据按照从大到小,从小到大的,有意义或无意义的排列着.这个方法大家都会,用着几个按钮就都能搞定. 稍微复杂点的操作呢,比如按多关键字排序,按照单元格颜色排序,局部排序,按行横向排序,excel是如何完成的呢?耐心往下看. 1 按照多关键字排序.先看数据源,先按单据编号排序,在单据编号相同的情况下,按照商品编号排序,如果商品编号再相同,就按单据日期排序.这个

极角排序详解:

极角排序详解 名词释义: 在平面内取一个定点O,叫极点,引一条射线Ox,叫做极轴,再选定一个长度单位和角度的正方向(通常取逆时针方向).对于平面内任何一点M,用ρ表示线段OM的长度(有时也用r表示),θ表示从Ox到OM的角度,ρ叫做点M的极径,θ叫做点M的极角,有序数对 (ρ,θ)就叫点M的极坐标 四种极角排序代码详解: 1 struct point 2 { 3 double x,y; 4 }; 5 6 double cross(double x1,double y1,double x2,dou

python的sorted排序详解

排序,在编程中经常遇到的算法,我也在几篇文章中介绍了一些关于排序的算法.有的高级语言内置了一些排序函数.本文讲述Python在这方面的工作.供使用python的程序员们参考,也让没有使用python的朋友了解python.领略一番"生命有限,请用Python"的含义. 内置函数sorted()/list.sort()的使用 简单应用 python对list有一个内置函数:sorted(),专门用于排序.举例: >>> a=[5,3,6,1,9,2] >>&

数据结构与算法分析之----各种常用排序详解

1.选择排序 思想:在需要进行排序的序列中,每次把最小(或最大)的交换到最左边的位置 案例: 待排序数组: 5 2 6 8 4 1 选择过程:    5 2 6 8 4 1 => 2 5 6 8 4 1 => 1 5 6 8 4 2 => 1 4 6 8 5 2 => 1 2 6 8 5 4 => 1 2 5 8 6 4 => 1 2 4 8 6 5... 2.冒泡排序 思想:在需要进行排序的序列中,每次把最小(或最大)的推到最顶端,像气泡一样往上冒 案例: 待排序

强连通分量与拓扑排序略解

$ ??????????????? ? $强连通分量与拓扑排序 拓扑排序 $ ??????$对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前.通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列.简单的说,由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序. (by 百度百科) $

排序详解(希尔,快排,归并等)

今天集中把几种排序的方法列一下,当然最出名的希尔,快排,归并和其优化当然也是满载 说到希尔排序的话,不得不先提到的就是插入排序了,希尔排序就是对直接插入排序的一种优化,下面就是直接插入排序的思想 1 void InsertSort(int *a, size_t size) 2 { 3 assert(a); 4 for (int i = 1; i < size; ++i) 5 { 6 int index = i; 7 int tmp = a[index]; 8 int end = index -