字典创建有向图,查找图节点之间的路径,最短路径,所有路径

  1. """
  2. 参考文档:
  3. https://www.python.org/doc/essays/graphs/
  4. """
  5.  
  6. # 此有向图 有六个节点 (A-F) 和八个弧
  7. """
  8. 它可以由以下Python数据结构表示:
  9. 这是一个字典,其键是图形的节点。
  10. 对于每个键,相应的值是一个列表,其中包含由来自此节点的直接连接的节点;即两点直接连接
  11. 这很简单(更简单的是,节点可以用数字而不是名称来表示,但名称更方便,可以很容易地携带更多信息,例如城市名称)。
  12. """
  13. from collections import deque
  14.  
  15. graph = {
  16. 'A': ['B', 'C'],
  17. 'B': ['C', 'D'],
  18. 'C': ['D'],
  19. 'D': ['C'],
  20. 'E': ['F'],
  21. 'F': ['C'],
  22. }
  23.  
  24. # 找到一个符合条件的路径
  25. """让我们编写一个简单的函数来确定两个节点之间的路径。
  26. 它采用图形以及开始和结束节点作为 参数。
  27. 它将返回包含路径的节点列表(包括开始节点和结束节点)。如果找不到路径,则返回 None。
  28. 同一节点在返回的路径上不会出现多次(即它不会包含循环)。
  29. 该算法使用了一种称为回溯的重要技术:它依次尝试每种可能性,直到找到解决方案。
  30. """
  31.  
  32. def find_path(graph, start, end, path=[]):
  33. path = path + [start] # 路径,每一次递归调用时,把当前结点加入已经访问的集合中去
  34. print("path:%s" % path)
  35. if start == end:
  36. return path
  37. if start not in graph: # 仅存在此节点 不作为弧头出现,仅作为弧尾[数据结构唐朔飞]
  38. return None # 递归结束的条件
  39. print("graph[{}]:{}".format(start, graph[start]))
  40. for node in graph[start]: # 依次访问start的邻接顶点node
  41. if node not in path: # 同一节点在返回的路径上不会出现多次
  42. print("node:{}".format(node))
  43. newpath = find_path(graph, node, end, path) # 递归调用时传入参数path
  44. # print("newpath:{}".format(newpath))
  45. # newpath=False
  46. if newpath:
  47. # print("if--newpath:{}".format(newpath))
  48. return newpath # 找到一条路径便结束循环
  49. return None
  50.  
  51. """
  52. 更改上函数以返回所有路径的列表(不带循环),而不是它找到的第一个路径
  53. """
  54.  
  55. # 找到所有的路径
  56. def find_all_paths(graph, start, end, path=[]):
  57. path = path + [start]
  58. if start == end:
  59. return [path]
  60. if start not in graph:
  61. return []
  62. paths = []
  63. for node in graph[start]:
  64. if node not in path:
  65. newpaths = find_all_paths(graph, node, end, path)
  66. for newpath in newpaths:
  67. paths.append(newpath) # 找到的路径加入路径列表
  68. return paths
  69.  
  70. # 最短路径
  71. def find_shortest_path(graph, start, end, path=[]):
  72. path = path + [start]
  73. if start == end:
  74. return path
  75. if start not in graph:
  76. return None
  77. shortest = None
  78. for node in graph[start]:
  79. if node not in path:
  80. newpath = find_shortest_path(graph, node, end, path)
  81. if newpath:
  82. if shortest is None or len(newpath) < len(shortest):
  83. # if not shortest or len(newpath) < len(shortest):
  84. shortest = newpath
  85. return shortest
  86.  
  87. """
  88. find_shortest_path可以使用BFS[广度优先搜索]在线性时间内完成。
  89. 此外,线性BFS更简单
  90. """
  91.  
  92. # path = find_path(graph, 'D', 'C')
  93. # print(path)
  94. # #---------------------------
  95. # paths = find_all_paths(graph, 'A', 'C')
  96. # print(paths)
  97. # row = 1
  98. # for path in paths:
  99. # print(row, end=":")
  100. # print(path)
  101. # row = row + 1
  102. # #---------------------------
  103. shortest = find_shortest_path(graph, 'A', 'D')
  104. print(shortest)

  

有向图_节点间路径路径--python数据结构的更多相关文章

  1. [Cracking the Coding Interview] 4.1 Route Between Nodes 节点间的路径

    Given a directed graph, design an algorithm to find out whether there is a route between nodes. 这道题让 ...

  2. 蓝桥杯_风险度量_dfs_无向图两节点间的所有路径

    标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如 ...

  3. dfs 无向图两节点间的所有路径

    标题:风险度量 X星系的的防卫体系包含 n 个空间站.这 n 个空间站间有 m 条通信链路,构成通信网.两个空间站间可能直接通信,也可能通过其它空间站中转. 对于两个站点x和y (x != y), 如 ...

  4. Python笔记_第二篇_面向过程_第二部分_2.路径、栈和队列、内存修改

    这一部分分三个主题进行讲解,主要为后面的模块.包.第三方库的概念补充一些相关的内容. 1. 路径(Path): 相对路径和绝对路径. 举例1:我们先导入一个os库(模块)来观察一下路径 import ...

  5. MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)

    背景说明 需求:MySQL树形结构, 根据指定的节点,获取其下属的所有子节点(包含路径上的枝干节点和叶子节点) 枝干节点:如果一个节点下还有子节点,则为枝干节点. 叶子节点:如果一个节点下不再有子节点 ...

  6. Comprehensive learning path – Data Science in Python深入学习路径-使用python数据中学习

    http://blog.csdn.net/pipisorry/article/details/44245575 关于怎么学习python,并将python用于数据科学.数据分析.机器学习中的一篇非常好 ...

  7. activiti如何获取当前节点以及下一步路径或节点(转)

    ACTIVITI相对于JBPM来说,比较年轻,用的人少,中文方面的资料更少,我根据网上到处找得资料以及看官方文档总结出来了代码,非常不容易啊.废话不多说,直接上代码吧: 首先是根据流程ID获取当前任务 ...

  8. 【每日一题】【DFS+存已加的值】2022年2月27日-二叉树根节点到叶子节点的所有路径和

    描述给定一个二叉树的根节点root,该树的节点值都在数字0−9 之间,每一条从根节点到叶子节点的路径都可以用一个数字表示.1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是 ...

  9. Python 数据结构和算法

    阅读目录 什么是算法 算法效率衡量 算法分析 常见时间复杂度 Python内置类型性能分析 数据结构 顺序表 链表 栈 队列 双端队列 排序与搜索 冒泡排序 选择排序 插入排序 希尔排序 快速排序 归 ...

  10. 集群节点间网络通信TIPC

    1. TIPC背景介绍 TIPC主要是用于集群网络环境之中,它这个协议有一些前提假设包括: 协议发送的大部分message都是直接到达目的地(无路由): message的传输时间都很短; messag ...

随机推荐

  1. MKV与MatroskaExtractor

    mkv封装格式相关内容可以参考:MKV 文件格式解析_Martyn哥的博客-CSDN博客_mkv 格式解析 本篇主要是用来记录MatroskaExtractor是如何解析EBML的,如何解析EBML ...

  2. webview2 示例 Samples Selenium

    https://github.com/MicrosoftEdge/WebView2Samples https://learn.microsoft.com/zh-cn/microsoft-edge/we ...

  3. OOP课第二阶段总结

    OOP课第二阶段总结 前言 作为第二次3+1的总结,明显感受到了此次题目集越来越复杂,结合了实际的物理知识来解决现实中的电路问题.因为电路可以一直扩展下去,情况千变万化,难以像上次题目集一样找到一个呆 ...

  4. 解决java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone

    错误描述: 使用JDBC连接数据库是产生错误 应该是数据库时区问题,在url配置时设置serverTimezone = GMT即可 url = "jdbc:mysql://localhost ...

  5. django通过channels实现websocket

    WebSocket协议是基于TCP的一种新的协议.WebSocket最初在HTML5规范中被引用为TCP连接,作为基于TCP的套接字API的占位符.它实现了浏览器与服务器全双工(full-duplex ...

  6. 590. N 叉树的后序遍历 | Javascript 递归实现

    题目 题目链接:590. N 叉树的后序遍历 解题思路 递归后续遍历,正常的思路 然后有一个要注意的地方就是如果js定义了全局变量来存储结果,每次调用函数之前一定要记得清空,否则答案会带上之前的结果. ...

  7. 手写LRU热点缓存数据结构

    引言 LRU是开发过程中设计缓存的常用算法,在此基础上,如何设计一个高效的缓存呢?本文就带大家分析并手撸一个LRUCache. LRU算法 LRU(Least recently used,最近最少使用 ...

  8. npm 发布自己的组件库

    npm 发布组件库步骤 第一步:注册 npm 账号 第二步:编写自己的组件库 第三部:编写 package.json 可以通过命令生成 npm init { "name": &qu ...

  9. AnnotationTransactionAttributeSource is only available on Java 1.5 and higher和windows同时安装jdk7和jdk8

    AnnotationTransactionAttributeSource is only available on Java 1.5 and higher和windows同时安装jdk7和jdk8 出 ...

  10. substr()函数用法

    substr()函数: 定义和用法: substr()返回字符串的一部分 如果start参数是负数且length小于等于start,则length为0 语法: substr(starting,star ...