有向无环图的判定及拓扑排序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了有向无环图的判定及拓扑排序相关的知识,希望对你有一定的参考价值。
1)输入给定有向图的顶点总数和所有顶点标志(每个顶点均用一个大写英文字母作为标志);
(2)输入图中弧的总数,并利用循环依次输入各条弧,建立该有向图的邻接表存储结构;
(3)从图中选取一个入度为零的顶点(如果存在多个顶点入度为零,则任选其中之一即可),标记该顶点并删除以该顶点为弧尾的所有弧,删除每条弧的同时更新相应弧头的入度值;
(4)不断重复步骤(3),直到找不到入度为零的顶点或者已经删除所有弧为止;
(5)如果还有顶点尚未标记(尚未标记顶点的入度肯定均不为零),或者还有弧结点未被删除,则可判定该图中存在环;如果可以将图中所有顶点全部标记,则标记顶点的顺序即为该有向无环图的拓扑序列;
(6)给出该图有无环的判定结果。若为有向无环图,则给出其拓扑序列;若图中存在环,则列出环中的所有顶点;
测试时分别输入存在环和不存在环的两个图,输出是否存在环的判定结果,并给出相应的拓扑序列或者列出环中的所有顶点。
请用C语言。谢谢了。
有向无环图
定义
边有向,无环。
英文名叫 Directed Acyclic Graph,缩写是 DAG。
性质
-
能 拓扑排序 的图,一定是有向无环图;
如果有环,那么环上的任意两个节点在任意序列中都不满足条件了。
-
有向无环图,一定能拓扑排序;
(归纳法)假设节点数不超过 (k) 的 有向无环图都能拓扑排序,那么对于节点数等于 (k) 的,考虑执行拓扑排序第一步之后的情形即可。
判定
如何判定一个图是否是有向无环图呢?
检验它是否可以进行 拓扑排序 即可。
当然也有另外的方法,可以对图进行一遍 DFS
,在得到的 DFS 树上看看有没有连向祖先的非树边(返祖边)。如果有的话,那就有环了。
以上是关于有向无环图的判定及拓扑排序的主要内容,如果未能解决你的问题,请参考以下文章