数据结构之图:用图解决案例,Python代码实现——24

用图解决畅通工程案例与途径查找

代码中需要引入的类方法代码链接:

  1. 无向图Undigraph
  2. 深度优先搜索DFS与广度优先搜索BFS

畅通工程-续

介绍

  • 案例和之前并查集中实现的一样,但问题略有改动,需要判断9-10城市是否相通,9-8城市是否相通:
    在这里插入图片描述

使用图解决次案例:

  1. 创建一个图无向图Undigraph对象 ,表示城市的图;
  2. 分别调用Undigraph对象的addEdge(0,1),addEdge(6,9),addEdge(3,8),addEdge(5,11),addEdge(2,12),addEdge(6,10),addEdge(4,8) ,表示把已经修好的道路把对应的城市连接起来;
  3. 通过Undigraph对象和顶点9 ,构建DepthFirstSearch对象或BreadthFirstSearch对象;
  4. 调用搜索对象的marked(10)方法和marked(8)方法,即可得到9和城市与10号城市以及9号城市与8号市是否相通。

数据集

traffic.txt

20
7
0 1
6 9
3 8
5 11
2 12
6 10
4 8

Python代码实现

from Structure.graph.Undigraph import Undigraph
from Structure.graph.DepthFirstSearch import DepthFirstSearch
from Structure.graph.BreadthFirstSearch import BreadthFirstSearchwith open('../traffic.txt', 'r') as f:total = int(f.readline())UG = Undigraph(total)connected_nums = int(f.readline())for i in range(connected_nums):road = f.readline().split()UG.add_edge(int(road[0]), int(road[1]))city1 = 9city2 = 8city3 = 10print(f"----------------DFS test-----------------------")DFS = DepthFirstSearch(UG, city1)print(f"Is city[{city1}] connected with city[{city2}]? {DFS.is_marked(city2)}")print(f"Is city[{city1}] connected with city[{city3}]? {DFS.is_marked(city3)}")print(f"----------------BFS test-----------------------")BFS = BreadthFirstSearch(UG, city1)print(f"Is city[{city1}] connected with city[{city2}]? {BFS.is_marked(city2)}")print(f"Is city[{city1}] connected with city[{city3}]? {BFS.is_marked(city3)}")

运行结果

----------------DFS test-----------------------
Is city[9] connected with city[8]? False
Is city[9] connected with city[10]? True
----------------BFS test-----------------------
Is city[9] connected with city[8]? False
Is city[9] connected with city[10]? True

9通过6和10相连,9和8不是相通的
traffic.txt:

20
7
0 1
6 9
3 8
5 11
2 12
6 10
4 8

图的路径查找

引入

  • 在实际生活中,地图是我们经常使用的一种工具,通常我们会用它进行导航,输入一个出发城市,输入-个目的地城市,就可以把路线规划好,而在规划好的这个路线上,会路过很多中间的城市。这类问题翻译成专业问题就是:从s顶点到顶点是否存在一条路径 ?如果存在,请找出这条路径。
    在这里插入图片描述在这里我们使用的是无向图,只找出一条能够连通的道路即可,后续学习了加权路径之后在寻找指定的路径

实现步骤

  • 我们实现路径查找,最基本的操作还是遍历或搜索图,所以,我们的实现暂且基于深度优先搜索来完成。其搜索的过程是比较简单的。我们添加了edgeTo[]整型数组,这个整型数组会记录从每个顶点回到起点s的路径。如果我们把顶点设定为0 ,那么它的搜索可以表示为下图:

属性与方法设计

  1. UD 接收传入的无向图
  2. start 接收传入的值,作为搜索的起点
  3. marked 标记是否已遍历
  4. edgeTo 是一个列表,索引代表顶点,值代表当前要搜索的路径中,从起点到索引对应顶点的最后一条边,是路径实现的核心属性
  5. dfs() 深度优先遍历图的顶点
  6. has_path_to(v) 获取从顶点开始是否已经遍历过该传入的顶点
  7. path_to(v) 获取从起点到达所传入的顶点的DFS路径

DFS.txt:

6
8
0 2
0 1
2 1
2 3
2 4
3 5
3 4
0 5

Python代码实现

from Structure.graph.Undigraph import Undigraphclass DepthFirstSearch:def __init__(self, graph, start):self.UD = graphself.start = startself.marked = [False for _ in range(self.UD.vertex)]self.edgeTo = [None for _ in range(self.UD.vertex)]self.dfs(start)def dfs(self, s):self.marked[s] = Trueedges = self.UD.get_edges_of(s)for e in edges:if not self.marked[e]:self.edgeTo[e] = sself.dfs(e)def has_path_to(self, v):return self.marked[v]def path_to(self, v):if not self.has_path_to(v):returnpath = [v]while self.edgeTo[v] != self.start:v = self.edgeTo[v]path.insert(0, v)path.insert(0, self.start)return pathif __name__ == '__main__':with open('../DFP.txt', 'r') as f:vertices = int(f.readline())UG = Undigraph(vertices)nums = int(f.readline())for i in range(nums):x, y = f.readline().split()UG.add_edge(int(x), int(y))DFP = DepthFirstSearch(UG, 0)print(DFP.path_to(5))

运行结果

[0, 2, 3, 5]

顺序不是唯一,跟建立边的顺序,以及设置的优先顺序也有关系,后续会学习到加了权重的边的图,则可以解决最短路径问题,引入的代码地址请回到顶部参考
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469491.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【在虚拟环境下完美解决】1698: error: (-215:Assertion failed) empty() in function cv::CascadeClassifier

问题描述 官方文档做的Demo发现遇到了错误提示如下: error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassifier::detectMultiScale’ 错误的原因: 出现 error: (-215:Assertion failed) !empty() in function ‘cv::CascadeClassif…

在线生成大全(这里真的什么都有)

粉丝身份证:http://id.igogo8.com/ 制作印章:http://www.makepic.com/print.php 邮址图片生成:http://www.makepic.com/email.php条形码生成:http://www.makepic.com/barcode.phpKiss学堂 颁发结业证:http://www.makep…

Git 忽略一些文件的提交

首先 git init 初始化一个git 代码仓库 git add . 向这个仓库提东西 git config --global core.excludesfile .gitignore 用.gitignore 这个文件来忽略不比较的内容 vi .gitignore /Music/res/对这个文件下的内容不进行比较然后还要 git rm --cached /Music/res/* -r …

计算机视觉概述:视觉任务+场景领域+发展历程+典型任务

一、什么是计算机视觉 定义:计算机视觉(Computer vision)是⼀⻔研究如何使机器“看”的科学,更 进⼀步的说,就是指⽤摄影机和计算机代替⼈眼对⽬标进⾏识别、跟踪和测量 等,⽤计算机处理成为更适合⼈眼观察…

数据结构之图:有向图的介绍与实现,Python代码实现——25

有向图的介绍 引入 在实际生活中,很多应用相关的图都是有方向性的,最直观的就是网络,可以从A页面通过链接跳转到B页面,那么a和b连接的方向是a->b,但不能说是b->a,此时我们就需要使用有向图来解决这一类问题,它和我们之前学习的无向图,最大的区别就在于连接是具有方向的…

Linux加载vmlinux调试

使用gdb加载内核符号表 arm-eabi-gdb out/target/product/msm8625/obj/KERNEL_OBJ/vmlinux 在内核的.config里面要打开 DEBUG_INFO和DEBUG_VM 定位故障代码 (gdb) l * qrd7627a_add_io_devices+0x100 0xc07cd05c is in qrd7627a_add_io_devices (/home/yejialong/GH700C/kernel…

图像分类_01图像分类简介:挑战+近邻分类器+CIFAR-10数据集概述

2.1.1 图像分类 任务目的:对输入的图像赋予一个标签,这个标签在指定类别集合中。 下面这个例子中,图像分类模型拍摄一张图像并将概率分配给4个标签{cat,dog,hat,mug}。如图所示,请记住&#xf…

数据结构之图:有向图的拓扑排序,Python代码实现——26

有向图的拓扑排序 拓扑排序介绍 什么是拓扑排序? 一个有向图的拓扑排序(Topological sort 或 Topological ordering)是根据其有向边从顶点U到顶点V对其所有顶点的一个线性排序举个例子:让一个拓扑排序的图中的所有顶点代表某项…

Openstack 一直在调度中解决

查看日志/var/log/nova/nova-scheduler.log,/var/log/nova/nova-compute.log,均无报错 查看/var/log/nova/nova-conductor.log报错为 2017-02-06 09:27:04.976 2206 ERROR oslo_messaging.rpc.server OperationalError: (pymysql.err.OperationalError) (1040, uToo many conne…

图像分类_02神经网络(NN)简介:定义+ 感知机+历史

2.2.1 什么是神经网络 人工神经网络( Artificial Neural Network, 简写为ANN)也简称为神经网络(NN)。是一种模仿生物神经网络(动物的中枢神经系统,特别是大脑)结构和功能的 计算模型…

【Github教程】史上最全github使用方法:github入门到精通

原文 http://www.eoeandroid.com/thread-274556-1-1.html 【初识Github】 首先让我们大家一起喊一句“Hello Github”。YEAH!就是这样。Git是一个分布式的版本控制系统,最初由Linus Torvalds编写,用作Linux内核代码的管理。在推出后,Git在其…

图像分类_03分类器及损失:线性分类+ SVM损失+Softmax 分类+交叉熵损失

2.3.1 线性分类 2.3.1.1 线性分类解释 上图图中的权重计算结果结果并不好,权重会给我们的猫图像分配⼀个⾮常低的猫分数。得出的结果偏向于狗。 如果可视化分类,我们为了⽅便,将⼀个图⽚理解成⼀个⼆维的点,在下⾯坐标中显示如下…

数据结构之图:加权无向图与寻找最小生成树,Python——27

加权无向图与prim算法和Kruskal算法寻找最小生成树 加权无向图的介绍 引入 加权无向图是一种为每条边关联一 个权重值或 是成本的图模型。这种图能够自然地表示许多应用。在一副航空图中,边表示航线,权值则可以表示距离或是费用。在一副电路图中,边表示导线,权值则可能表示导…

课程简介

什么是网页布局? 网页布局是网页制作的基础。 DIVCSS布局网页 流式布局、浮动布局、绝对定位布局 相关知识点 标准文档流 盒子模型 float属性 position属性 三个案例 自动居中-列布局案例--盒子模型的使用方法 浮动布局案例--float属性 解决浮动影响的方法 绝对定位…

图像分类_04神经网络最优化过程:反向传播+代码实现

logistic模型原理与推导过程分析(1)https://blog.csdn.net/qq_39237205/article/details/121031296https://blog.csdn.net/qq_39237205/article/details/121031296 logistic模型原理与推导过程分析(2)https://blog.csdn.net/qq_3…

数据结构之图:加权有向图与dijkstra算法找到最短路径,Python——28

加权有向图与dijkstra算法找到最短路径 加权有向图的构造 最短路径问题与最短路径树 最短路径问题(The shortest path problem)定义 最短路径可以是时间花费最短,也可以是距离最短,或是花费最少在图论中,最短路径问…

【转】构建微服务架构的最佳实践2/3

本文是这一系列文章的第二篇,将介绍服务的交互。 服务的交互 微服务架构提倡有许多职责单一的小服务组成,这些服务之间互相交互。然而这就造成了一系列的问题,比如:服务之间如何发现彼此?是否采用统一的协议&#xff1…

李沐动手学深度学习pytorch :问题:找不到d2l包,No module named ‘d2l’

同学你好!本文章于2021年末编写,已与实际存在较大的偏差! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)…

[已解决]fdfs-client-py==1.2.6安装失败

fdfs-client-py1.2.6解决方法 下载修改版的fdfs的master.zip文件到任意文件夹: https://pan.baidu.com/s/12UwP6IBqvXK9AuVt3oEuCA 提取码:fdfs 复制这段内容后打开百度网盘手机App,操作更方便哦 进入你要安装模块的目录中并激活环境&#x…

解决loaded more than 1 DLL from .libs和No metadata found in lib\site-packages两个错误

### 卸载numpy pip uninstall numpy 解决No metadata found in lib\site-packages 去这个文件夹下找到numpy的两个文件夹 删除 然后重新输入pip install numpy