有向图中任意两点的路径

图技术

利用neo4j、networkx、dgl、python做图分析挖掘

【1】最短路径算法dijkstra
【2】基于networkx的隐性集团关系识别模型
【3】基于Neo4j的担保社群型态分析挖掘
【4】基于python求有向无环图中target到其他节点全路径


前言

随着人工智能的不断发展,图这门技术也越来越重要,很多人都开启了学习图技术,本文就介绍了图技术中的计算任意两点的路径。


一、任意两点的路径

如下图所示,求企业A与企业D的路径

企业A
企业B
企业C
企业D

二、使用步骤

1.图表示

图在python中,一般可以采用字典表示,如上图中可以表示为

graph = dict()
graph['A'] = ['B', 'C']
graph['B'] = ['C']
graph['C'] = ['D']
print(graph)
{'A': ['B', 'C'], 'B': ['C'], 'C': ['D']}

2.算法步骤

  • 初始化,全部路径paths、单条路径path = [start];
  • 广度遍历查找路径,
    • 判断start是否在graph中:
      • 如过不在图中,则结束;
    • 判断单条路长是否超出阈值:
      • 如果超出阈值,则结束;
    • 遍历start的邻居节点:
      • 判断起始节点是否在单条path出现:
        • 如果没有则追加;
        • 如果有,即出现环,则结束
      • 如果单条path没有出现在paths里且满足终点等于target,则在结果中追加
      • 以新的邻居节点dfs

三、代码表示

class Solution:
    #graph表示一张图
    #start表示起始节点
    #target表示终止节点
    #cut表示最大路长
    def searchpaths(self, start, target, cut):
        paths = []
        path = []
        #graph = {1:[2, 5], 2:[3, 4], 3:[4, 5], 5:[6]}
        graph = {'A': ['B', 'C'], 'B': ['C'], 'C': ['D']}

        def dfs(start, target):
            #如果起始节点不在图中,则结束
            if start not in graph:
                return
            #如果路长大于阈值,则结束
            if len(path) >= cut:
                return
            #遍历起始节点的邻居节点
            for neighbor in graph[start]:
                #如果起始节点没有在单条path出现,则追加
                if neighbor not in path:
                    path.append(neighbor)
                #出现环,则结束
                else:
                    return
                #如果单条path没有出现在paths里且满足终点等于target,则在结果中追加
                if path not in paths and path[-1] == target:
                    #拷贝
                    paths.append(path[:])
                #以新的邻居节点dfs
                dfs(neighbor, target)
                #last的追加了neighbor,需要返回
                path.pop()
        path.append(start)
        dfs(start, target)
        return paths
print(Solution().searchpaths(start='A', target='D', cut=30))
[['A', 'B', 'C', 'D'], ['A', 'C', 'D']]
Process finished with exit code 0
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值