C++图的拓扑排序是什么
导读:本文共2398字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 一、前言且该序列必须满足下面两个条件:每个顶点出现且只出现一次。若存在一条从顶点 x到顶点 y的路径,那么在序列中顶点 x 出现在顶点 y的前面。拓扑排序只适用于 AOV网 (有向无环图)若图中有环,则一定不存在拓扑序。可以证明,一个有向无环图,一定存在一个拓扑序列。有向无环图,又被称为拓扑图。入度: 即有多少条边指向自己这个节点。出度: 即有多少条边从自己这个... ...
目录
(为您整理了一些要点),点击可以直达。且该序列必须满足下面两个条件:
每个顶点出现且只出现一次。
若存在一条从顶点 x到顶点 y的路径,那么在序列中顶点 x 出现在顶点 y的前面。
拓扑排序只适用于 AOV网 (有向无环图)
若图中有环,则一定不存在拓扑序。
可以证明,一个有向无环图,一定存在一个拓扑序列。有向无环图,又被称为拓扑图。
入度: 即有多少条边指向自己这个节点。
出度: 即有多少条边从自己这个节点指出去。
算法流程:
用队列来执行 ,初始化所有入度为0的顶点入队。
主要由以下两步循环执行,直到不存在入度为 0 的顶点为止
选择一个入度为 0 的顶点,并将它输出;
删除图中从顶点连出的所有边
循环结束
若输出的顶点数小于图中的顶点数,则表示该图存在回路,即无法拓扑排序,
否则,输出的就是拓扑序列 (不唯一)
模板如下:
1.数组模拟队列实现拓扑排序
2.使用STL queue实现拓扑排序
时间复杂度 O(n+m), n表示点数,m表示边数
给定一个 n 个点 m 条边的有向图,点的编号是 1 到 n,图中可能存在重边和自环。
请输出任意一个该有向图的拓扑序列,如果拓扑序列不存在,则输出 −1。
思路
我们每次找到入读为0的点,然后把他插入到队列里,然后将这个点删除,这也就意味着这个点连接的下一个点(可能是多个)的入度就会减1。
这个时候,我们就进入了下一轮。
我们因为前面将一个点删除了,那么它指向的点的入度就会都减去1,所以,就会出现新的点的入度为0,这个点显然是因为它的入度小,所以它理所应当的排在拓扑序里面在第二位。当前面的一个点没有了被删除了,那它就要首当其冲了。
和图的BFS思路很像,但是加了搜索的规则(即入度为零的先被搜索)可以看点这里
AC代码
C++图的拓扑排序是什么的详细内容,希望对您有所帮助,信息来源于网络。