美文网首页
计算有向图中环的数量

计算有向图中环的数量

作者: 坐看云起时zym | 来源:发表于2019-07-20 16:51 被阅读0次

首先,我们先删除图中的孤立点(对应于邻接矩阵,即,第i行和第j列均为0的点)。其次,我们对于有向图进行深度优先搜索(具体思路与利用DFS判断有向图是否为DAG相同,https://www.jianshu.com/p/acc0eb465cd8) ,每搜索出一个环之后,计数+1.

import numpy as np

"""
color[i] = 0, 没有被访问过
color[i]  = -1, 后裔节点均被访问过
color[i]  = 1, 之前被访问过,后裔节点中正在被访问
"""

class Graph(object):
            
    def __init__(self,G):
        self.color = [0] * len(G)
        self.G = np.array(G)
        self.isDAG = True
        self.circlecount = 0
    
  #对于graph进行预处理,删除孤立点
    def graph_preprocessing(self):
        index = []
        for i in range(len(self.G)):
            if np.sum(self.G[:,i]) == 0 and np.sum(self.G[i,:]) == 0:
                index.append(i)
        #delete columns
        self.G = np.delete(self.G,index, axis=1)
        #delte rows
        self.G = np.delete(self.G,index, axis=0)   
        self.color = [0] * len(self.G)
                
    def DFS(self,i):
        self.color[i] = 1
        for j in range(len(self.G)):
            if self.G[i][j] != 0:
               # print(str(i) + 'can go to '+ str(j))
                if self.color[j] == 1:
                    self.circlecount = self.circlecount + 1
                    self.isDAG = False
                elif self.color[j] == -1:
                    continue
                else:
                    #print('We are visiting node' + str(j))
                    self.DFS(j)
        self.color[i] = -1
        #print(str(i) + " has been examined")
        
    def DAG(self):
        for i in range(len(self.G)):
            if self.color[i] == 0:
                print(i)
                self.DFS(i)

对于上述程序,进行了三次测试


test1.png
##test1 circle = 2              
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,1,0,1,0,0,0]]
G1 = Graph(G)
G1.DAG()
test2.png
###test2 circle = 3
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],
     [1,0,0,0,0,0,0],
     [0,0,0,0,0,0,1],
     [0,1,0,1,0,0,0]]
G1 = Graph(G)
G1.DAG()
test3.png
###test3 circle = 4
G = [[0,0,1,0,0,0,0,0,0,0],
     [0,0,1,0,0,0,0,0,0,0],
     [0,0,0,1,0,0,0,0,0,0],
     [0,0,0,0,1,1,0,0,0,0],
     [1,0,0,0,0,0,0,0,0,0],
     [0,0,0,0,0,0,1,0,0,0],
     [0,1,0,1,0,0,0,0,0,0],
     [0,0,0,0,0,0,0,0,1,0],
     [0,0,0,0,0,0,0,0,0,1],
     [0,0,0,0,0,0,0,1,0,0]]

G1 = Graph(G)
G1.DAG()

相关文章

  • 计算有向图中环的数量

    首先,我们先删除图中的孤立点(对应于邻接矩阵,即,第i行和第j列均为0的点)。其次,我们对于有向图进行深度优先搜索...

  • 数据结构之图的存储结构十字链表法

    一、邻接表法回顾 邻接表法特点: 可以存储有向图和无向图 计算节点的出度很快(边链表数量) 计算节点的入度很慢(需...

  • NetworksX 图 使用

    1.有向图 2.无向图 3.节点颜色图 计算:计算1:求无向图的任意两点间的最短路径 结果 计算2:求出有向图中得...

  • Lecture 3-4

    P4- 连通图、有向图、计算出度入度 有向图的定义 If the edges are directed, the ...

  • 实现自动微分之静态图和动态图

    计算图 计算图:用来描述运算的有向无环图。计算图有两个主要元素:节点(Node)和边(Edge)。节点:表示数据,...

  • Pytorch框架学习(3)——计算图与动态图机制

    计算图与动态图机制 1. 计算图 计算图是用来描述运算的有向无环图 计算图有两个主要元素:结点(Node)和边(E...

  • TensorFlow 初识

    核心概念 TensorFlow 中的计算可以表示为一个有向图(directedgraph),或称计算图(compu...

  • 有向线段的数量积

    概述 数量积问题中平面向量一般以有向线段形式或向量形式给出.本词条主要介绍以有向线段形式给出的数量积问题.如下例:...

  • 2018-02-17 神经网络基础(二)

    计算图和计算图的导数计算 前向传播计算出神经网络的输出 反向传播计算梯度或导数 logistic回归中的梯度下降 ...

  • Tensorflow基本概念

    1.TensorFlow中的计算表示为有向图(directed graph),用于描述数据的计算流程。其中每一个运...

网友评论

      本文标题:计算有向图中环的数量

      本文链接:https://www.haomeiwen.com/subject/bzjulctx.html