如何判断一个图是否为有向无环图(DAG)

判断图是否为有向无环图的基本思想为:从任意点出发,都不会再回到该点。
Description:
Input:邻接矩阵
color:用来记录节点被访问的情况。‘0’代表未被访问过,‘1代表正在访问’,‘-1’代表该点的后裔节点都已经被访问过。在一次搜索中,若某点的状态为1,则该点之前被访问过,存在环。若某点的状态为‘-1’,则该点的后裔点均被访问过,跳过该次搜索。若某点的状态为‘0’,则该点之前没有被访问过,DFS该点。

class Graph(object):
    def __init__(self,G):
      self.G = G
      self.color = [0] * len(G)
      self.isDAG = True
        
    def DFS(self,i):
        self.color[i] = 1
        for j in range(len(self.G)):
            if self.G[i][j] != 0:
                if self.color[j] == 1:
                    self.isDAG = False
                elif self.color[j] == -1:
                    continue
                else:
                    print('We are visiting node' + str(j + 1))
                    self.DFS(j)
        self.color[i] = -1

    def DAG(self):
        for i in range(len(self.G)):
            if self.color[i] == 0:
                self.DFS(i)
     

本文分别用一个有向无圈图和一个有向有圈图做测试:


acyclic_directed_graph.png
G = [[0,0,1,0,0,0],
     [0,0,1,0,0,0],
     [0,0,0,1,0,0],
     [0,0,0,0,1,1],
     [0,0,0,0,0,0],
     [0,0,0,0,0,0]]

G1 = Graph(G)
G1.DAG()
G1.isDAG

acyclic.png
cyclic_directed_graph.png
G = [[0,0,1,0,0,0,0],
     [0,0,1,0,0,0,0],
     [0,0,0,1,0,0,0],
     [0,0,0,0,1,1,0],
     [0,0,0,0,0,0,0],
     [0,0,0,0,0,0,1],
     [0,0,0,1,0,0,0]]

G2 = Graph(G)
G2.DAG()
G2.isDAG

cyclic.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,484评论 0 13
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,495评论 0 5
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 7,784评论 0 8
  • 消息不回复皆是有问题状况发生,容许一定时间的缓冲,真相得知。 果真,罗列了一通。忙碌,身体不适,高烧。 是夜,猛然...
    怀想君阅读 1,648评论 0 0
  • ​美国的孩子上课喜欢动动手,所以老师在做课程设计时常常将学科知识和动手活动结合在一起。其实,这也体现着STEM的精...
    未来课程智库阅读 9,981评论 0 3

友情链接更多精彩内容