【图技术】有向图中任意两点的路径
基于networkx的隐性集团关系识别模型
 基于Neo4j的担保社群型态分析挖掘 
前言
随着人工智能的不断发展,图这门技术也越来越重要,很多人都开启了学习图技术,本文就介绍了图技术中的计算任意两点的路径。
一、任意两点的路径
如下图所示,求企业A与企业B的路径
二、使用步骤
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










