python判断有向无环图的方法

对环状结构图,从任一点出发经过环路均能回到该点。若将环状结构的父节点集合与子节点集合分别提取出来,会发现两者相同。而若有向图存在非环状结构,包含根节点(不存在父节点的父节点)与叶结点(不存在子节点的子节点),该结构的父节点集合与子节点集合不完全相同。

因此,对任意图结构,每次进行“剪枝”,,剪去全部根、叶节点及根、叶节点涉及的连边,再对剩下的图进行判断,剪去新的根、叶节点……若整个图结构被完全剪除,则说明该图结构为有向无环图;若存在无法进行“剪枝”的剩余部分,剩余的部分即为全部环状结构的集合。

代码示例:

import numpy as np


array1 = np.array([[1,4], [1,5], [2,6], [3,7], [4,8], [6,9], [6,10], [7,11], [8,12], [9,13]])
array2 = np.array([['A','B'], ['B','C'], ['C','D'], ['D','B'], ['D','E'], ['E','F'], ['F','G'], ['G','E'], ['G','H']])

def judge(array):
    arrayTmp = array
    while len(arrayTmp) != 0:
        parents = set([_[0] for _ in arrayTmp])
        children = set([_[1] for _ in arrayTmp])
        middleNodes = parents & children
        if len(middleNodes) == len(parents) == len(children):
            return False
        else:
            arrayTmp = [_ for _ in arrayTmp if _[0] in middleNodes and _[1] in middleNodes]
    return True

print(judge(array1), judge(array2))

点对集合array1表示的图结构不包含环状结构,因此函数输出值为True,表明是有向无环图;点对集合array2表示的图结构包含环状结构,因此函数输出值为False,表明不是有向无环图。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值