利用python实现DFS 两点间所有路径

利用python实现DFS 两点间所有路径(通信网理论基础–作业参考)
题目要求

代码应能读取规定格式的TXT文档作为输入,格式如下:
5 7 #第一行:图的节点数N,边数V
1 2 #后续V行: 图中每一条边的起点、终点
1 5
2 3
2 4
3 4
3 5
4 5
2 5 #最后一行:待求解目标的起点、终点

代码应以直观的形式输出所有可行路径,以便于结果检查。例如:
2->1->5

2->4->3->5

2 1 5

2 4 3 5
等等

edgeLinks = dict()
size = 0
stack = []

def addEdge(a,b):  #该函数进行加边操作   构造一个完整的字典形如
    '''edgeLinks{
  "1":["2" "5"]
  "2":["1" "3" "4"]
  "3":["2" "4" "5"]
  "4":["2" "3" "5"]
  "5":["1" "3" "4"]
  }'''
    #上式为演示的该函数处理完的结果
    global edgeLinks
    if a not in edgeLinks:
        edgeLinks[a] = set()
    if b not in edgeLinks:
        edgeLinks[b] = set()
    edgeLinks[a].add(b)
    edgeLinks[b].add(a)



def Check(graph, s, e, path=[]):  # s起点,e终点
    path = path + [s]
    # print('path',path)   取消注释查看当前path的元素
    if s == e:
        # print('回溯')
        return [path]

    paths = []
    # 存储所有路径
    for node in graph[s]:
        if node not in path:
            ns = Check(graph, node, e, path)
            for n in ns:
                paths.append(n)
    # print(paths,'回溯')
    return paths

def load():  #读取文件并进行节点数边数,起点终点的获取
    f = open('D:/python/txt/project1输入样例.txt', 'r') #需要把txt文件路径赋给左侧地址
    global size, edgeLinks
    size, edgeCount = map(int, f.readline().split())
    print("节点数为:%d"%size, "边数为:%d"%edgeCount)
    for i in range(edgeCount):
        a,b = f.readline().split()
        addEdge(a,b)#进入addEdge函数 把边加进去 注意上面已经读过一行 还需要读取边数edgeCount行
        # print(a,b)
    re = f.readline()  #最后一行即 起点a与终点b
    f.close()
    return re

if __name__ == '__main__':
    a,b=load().split()    #进入load()函数  a,b为起点和终点Check(graph, a, b)
    print("起点:", a, "终点:", b)
    allpath = Check(edgeLinks,a,b)
    for p in allpath:
        print("路径有:%s"%p)

读取如下:(复制后存在txt文档里哦)
5 7
1 2
1 5
2 3
2 4
3 4
3 5
4 5
2 5
输出结果如下:

在这里插入图片描述

END

借鉴了点个赞再走哦

  • 17
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值