python求无向图两点间所有路径

方法一,通过回溯查找

假如我们要查找的图为:
在这里插入图片描述

通过一个字典进行保存:

graph = {"A":["B","C"],
         "B":["A","C","D"],
         "C":["A","B","D","E"],
         "D":["B","C","E","F"],
         "E":["C","D"],
         "F":["D"],
         }  #用一个字典保存图

求任意两点之间所有路径:

def findAllPath(graph,start,end,path=[]):
    #path.append(start)
    path = path + [start]
    if start == end:
        return path
 
    for node in graph[start]:
        if node not in path:
            newpaths = findAllPath(graph,node,end,path) 
            for newpath in newpaths:
                if newpath==end:
                    path.append(newpath)
                    paths.append(path)
    return paths

输入输出:

输入:
paths = [] #存储所有路径
path=findAllPath(graph,"A","F")  
输出:
[['A', 'B', 'C', 'D', 'F'],
 ['A', 'B', 'C', 'E', 'D', 'F'],
 ['A', 'B', 'D', 'F'],
 ['A', 'C', 'B', 'D', 'F'],
 ['A', 'C', 'D', 'F'],
 ['A', 'C', 'E', 'D', 'F']]

方法二、由图的邻里表进行查找

程序如下:

def findAllPath(graph,start,end):
    path=[]
    stack=[]
    stack.append(start)
    visited=set()
    visited.add(start)
    seen_path={}
    #seen_node=[]
    while (len(stack)>0):
        start=stack[-1]
        nodes=graph[start]
        if start not in seen_path.keys():
            seen_path[start]=[]     
        g=0
        for w in nodes:
            if w not in visited and w not in seen_path[start]:
                g=g+1
                stack.append(w)
                visited.add(w)
                seen_path[start].append(w)
                if w==end:
                    path.append(list(stack))
                    old_pop=stack.pop()
                    visited.remove(old_pop)
                break    
        if g==0:
            old_pop=stack.pop()
            del seen_path[old_pop]
            visited.remove(old_pop)
    return path
   
  输入:
  path=findAllPath(graph,"A","F")  
  输出:
  [{'A', 'B', 'C', 'D', 'F'},
 {'A', 'B', 'C', 'D', 'E', 'F'},
 {'A', 'B', 'D', 'F'},
 {'A', 'B', 'C', 'D', 'F'},
 {'A', 'C', 'D', 'F'},
 {'A', 'C', 'D', 'E', 'F'}]
 #因为后面要比较相同点的路径只去一条所以把结果用一个集合保存 最开始用list保存有问题。

求解图的最短路径算法:

Floyd算法
Dijkstra算法
————————————————
原文链接:https://blog.csdn.net/qq_36025591/article/details/105513297

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值