图、遍历、连通、最短路径&代码演练

图是计算机科学中的一种数据结构,它由节点(顶点)和边组成。在实际应用中,图经常被用来表示复杂系统之间的关系,如社交网络、交通网络等。本文将介绍图的基本概念和应用,并提供Python代码实现。同时,我们还将介绍如何使用深度优先搜索和广度优先搜索遍历图,如何判断图的连通性,以及如何求解最短路径问题。

  1. 图的基本概念
    图由节点(顶点)和边组成,通常用G=(V,E)表示。其中,V为顶点集合,E为边的集合。如果两个顶点之间有一条边,则称这两个顶点是相邻的。无向图中的边没有方向,可以双向移动;有向图中的边有方向,只能单向移动。加权图也是一种常见的图,每条边都带有一个权重值。

下面是一个简单的Python代码,用于实现无向图:

class Graph:def __init__(self):self.vertices = {}self.edges = {}def add_vertex(self, vertex):if vertex not in self.vertices:self.vertices[vertex] = []def add_edge(self, v1, v2):if v1 not in self.vertices:self.add_vertex(v1)if v2 not in self.vertices:self.add_vertex(v2)self.vertices[v1].append(v2)self.vertices[v2].append(v1)def print_graph(self):for v in self.vertices:print(v, end=' -> ')print(self.vertices[v])

在上述代码中,Graph类表示无向图,其中包含一个字典vertices,用于存储每个顶点及其相邻的顶点列表。add_vertex()方法用来添加顶点,add_edge()方法用来添加边,print_graph()方法用来打印整张图。

  1. 遍历图
    图的遍历是指按照某种顺序依次访问图中的所有顶点。常见的图遍历算法有深度优先搜索和广度优先搜索。

2.1 深度优先搜索
深度优先搜索(DFS)是一种递归方式的图遍历算法,其思路是从起始顶点开始,沿着一条路径不断向下探索直到无法继续为止,然后回溯到上一个节点继续遍历。深度优先搜索可以用来查找是否存在一条路径从起始顶点到目标顶点。

下面是一个简单的Python代码,用于实现深度优先搜索:

def dfs(graph, start, visited=None):if visited is None:visited = set()visited.add(start)print(start, end=' ')for neighbor in graph.vertices[start]:if neighbor not in visited:dfs(graph, neighbor, visited)

在上述代码中,dfs()函数接收三个参数:graph表示待遍历的图,start表示起始顶点,visited表示已访问过的顶点集合。如果visited未被初始化,则将其设为空集。接着,将起始顶点加入visited集合,并输出该顶点。然后,遍历与该顶点相邻的顶点,如果该相邻顶点未被访问,则递归调用dfs()函数进行遍历。

2.2 广度优先搜索
广度优先搜索(BFS)是一种迭代方式的图遍历算法,其思路是从起始顶点开始,按层次逐步扩展,先遍历与起始顶点相邻的所有顶点,然后遍历与这些

顶点相邻的所有未访问过的顶点,以此类推直到遍历完成。广度优先搜索可以用来查找两个顶点之间的最短路径。

下面是一个简单的Python代码,用于实现广度优先搜索:

from collections import dequedef bfs(graph, start):visited = set()queue = deque([start])while queue:vertex = queue.popleft()if vertex not in visited:visited.add(vertex)print(vertex, end=' ')for neighbor in graph.vertices[vertex]:if neighbor not in visited:queue.append(neighbor)

在上述代码中,bfs()函数接收两个参数:graph表示待遍历的图,start表示起始顶点。首先,初始化visited集合和queue队列,将起始顶点加入队列。然后,进入循环,每次从队列中取出一个顶点并进行判断,如果该顶点未被访问,则加入visited集合,并输出该顶点。接着,遍历与该顶点相邻的顶点,如果这些相邻顶点未被访问,则加入队列中等待遍历。

  1. 判断图的连通性
    在图论中,一个无向图被称为连通图当且仅当任意两个顶点之间都存在一条路径。如果一个无向图不是连通图,则其被称为非连通图或者不相连的图。判断一个无向图是否为连通图的方法是通过深度优先搜索或广度优先搜索,检查图中是否有未被访问过的顶点。

下面是一个简单的Python代码,用于判断无向图的连通性:

def is_connected(graph):visited = set()dfs(graph, next(iter(graph.vertices)), visited)return len(visited) == len(graph.vertices)

在上述代码中,is_connected()函数接收一个参数graph表示待检查的无向图。首先,初始化visited集合,并对任意一个顶点进行深度优先搜索。然后,比较已访问过的顶点数是否等于图中的顶点数,如果相等则说明该无向图是连通图。

  1. 求解最短路径问题
    求解最短路径问题是指在一个加权图中查找从起始顶点到目标顶点的最短路径。常见的算法有Dijkstra算法和A*算法。

4.1 Dijkstra算法
Dijkstra算法是一种贪心算法,其思路是从起始顶点开始,选择当前距离该顶点最近的未访问过的顶点,并更新与该顶点相邻的顶点的距离值。重复以上步骤直到找到目标顶点或者所有顶点都被访问过。

下面是一个简单的Python代码,用于实现Dijkstra算法:

import heapqdef dijkstra(graph, start, end):queue = [(0, start)]visited = set()while queue:(distance, vertex) = heapq.heappop(queue)if vertex == end:return distanceif vertex not in visited:visited.add(vertex)for neighbor, weight in graph.vertices[vertex]:heapq.heappush(queue, (distance + weight, neighbor))return -1

在上述代码中,dijkstra()函数接收三个参数:graph表示待求解的加权图,start表示起始顶点,end表示目标顶点。首先,初始化priority queue队列和visited集合,将起始顶点加入队列。然后,进入循环,每次从队列中取出一个顶点并进行判断,如果该顶点为目标顶点,则返回距离值。如果该顶点未被访问,则将其加入visited集合,并遍历与该顶点相邻的顶点,更新其距离值并加入队列中等待遍历。最后,如果没有找到目标顶点,则返回-1。

4.2 A算法
A
算法是一种启发式算法,其思路是在Dijkstra算法的基础上加入启发函数,用来估算从当前顶点到目标顶点的距离。根据启发函数的估值,可以优先遍历与目标顶点更接近的顶点,从而提高搜索效率。

下面是一个简单的Python代码,用于实现A*算法:

import heapqdef astar(graph, start, end, heuristic):queue = [(0, start)]visited = set()while queue:(distance, vertex) = heapq.heappop(queue)if vertex == end:return distanceif vertex not in visited:visited.add(vertex)for neighbor, weight in graph.vertices[vertex]:heapq.heappush(queue, (distance + weight + heuristic(neighbor, end), neighbor))return -1

在上述代码中,astar()函数接收四个参数:graph表示待求解的加权图,start表示起始顶点,end表示目标顶点,heuristic表示启发函数。首先,初始化priority queue队列和visited集合,将起始顶点加入队列。然后,进入循环,每次从队列中取出一个顶点并进行判断,如果该顶点为目标顶点,则返回距离值。如果该顶点未被访问,则将其加入visited集合,并遍历与该顶点相邻的顶点,根据启发函数的估值更新其距离值并加入队列中等待遍历。最后,如果没有找到目标顶点,则返回-1。

  1. 总结
    本文介绍了图的基本概念和应用,并提供了Python代码实现。同时,我们还介绍了深度优先搜索和广度优先搜索算法,以及如何判断无向图的连通性和求解最短路径问题。这些算法都是图论中非常重要的基础算法,在实际应用中有着广泛的应用。希望本文能够对读者理解和掌握图论的相关知识有所帮助。

Python算法学习[5]—图、遍历、连通、最短路径代码演练相关推荐

  1. 数据结构与算法学习笔记——图 C++实现

    数据结构与算法学习笔记--图 C++实现 1 概念 2 图的表示方法 3 算法 3.1 拓扑排序 3.2 图的搜索算法 3.2.1 广度优先搜索(BFS) 3.2.2 深度优先搜索(DFS) 3.3 ...

  2. Python算法学习: 竞码编程-蓝桥杯模拟赛3题解

    文章目录 A. 试题A:生存还是毁灭,这是一个问题 7' B. 试题B:小小神枪手 开局98K 8' C. 试题C:关云长单刀会金莲,贾宝玉三打白骨精 10' D. 试题D:抽刀断水水更流,举杯销愁愁 ...

  3. 【算法学习】图相关算法编程实现-深度优先遍历和广度优先遍历

    一.图的表示 图G=(V,E).要表示一个图,通常有两种方法:邻接表和邻接矩阵.两种方法都既可以表示有向图,也可以表示无向图. 邻接表表示由一个包含|V|个列表的数组组成,其中每个列表对应V中的一个顶 ...

  4. 数据结构和算法 -- 学习导图

    数据结构和算法 是作为程序员写出高效代码的基础,为了今后的两年在高效代码之路上持续精进,将按照此学习导图进行 算法和数据结构的刻意练习,同时也希望为同样有高效代码追求的伙伴们提供一条学习路径,共同进步 ...

  5. c 语言从大到小排序算法,10 大经典排序算法(动图演示+ C 语言代码)

    原标题:10 大经典排序算法(动图演示+ C 语言代码) 来源:C语言与CPP编程 以前也零零碎碎发过一些排序算法,但排版都不太好,又重新整理一次,排序算法是数据结构的重要部分,系统地学习很有必要. ...

  6. c++ set遍历_Python算法学习之图与图的遍历

    什么是图? 我们先来考虑日常生活中的一个问题,我们在出行的时候一般会考虑使用地图软件搜下从一个地点到另外一个地点的路线. 这里把地点抽象成一个圈,路径抽象成线,于是乎就有了下面的图,其实还是非常好理解 ...

  7. [算法学习no7]图的遍历

    图的遍历分为两种 1.深度优先搜索 2.广度优先搜索 图的遍历难度在于图有闭环,双向 所以一定不要迷路 因此,需要用数组标记访问过的结点即可 1.深度优先搜索 传入参数为结点 输出这个结点 标记这个结 ...

  8. 算法学习:图的深度优先遍历(DFS)

    图的深度优先遍历 采用邻接矩阵表示图的方法,递归实现. 栈的使用: 头文件:<stack> s.empty():栈空则返回true,否则返回false s.top():返回栈顶元素,不删除 ...

  9. 关键路径例题图表_算法学习记录-图——应用之关键路径(Critical Path)

    之前我们介绍过,在一个工程中我们关心两个问题: (1)工程是否顺利进行 (2)整个工程最短时间. 之前我们优先关心的是顶点(AOV),同样我们也可以优先关心边(同理有AOE).(Activity On ...

最新文章

  1. 网络传输模型(概念)
  2. C语言-什么是尾递归
  3. delphi json
  4. malloc 和new 区别
  5. Mac iterm2 终端优化
  6. 多个iis的进程w3wp
  7. 服务器设备性能说明,OMC服务器硬件性能和配置说明.doc
  8. c语言中ndigit用法,求C语言中头文件及函数的含意的总分类
  9. 【算法分析与设计】二分查找平均查找长度的求解
  10. 数据结构与算法之三直接插入排序
  11. python双人格斗游戏代码_百行 HTML5 代码实现四种双人对弈游戏
  12. SQL 2016——新功能
  13. 关于UnityHub更换位置后找不到编辑器以及登录界面白屏的问题
  14. 如果查找SCI期刊属于哪个中科院分区
  15. Idea碰到的问题总结
  16. ZZULIOJ1194: 总成绩排序(结构体专题)
  17. srs直播 java开发,使用 SRS/OBS/VLC 快速搭建直播服务系统
  18. 又一新框架 | 无监督图像转换任务新境界(附论文代码)
  19. SQL Server数据库插入数据中文显示乱码问题
  20. Delphi 10.3.1 RIO官方下载

热门文章

  1. DDD领域驱动设计实战 - 创建实体身份标识的常用策略
  2. FCS(Frame Check Sequence)
  3. 计算机与经济学数据分析,经济管理中的计算机应用:Excel数据分析统计预测和决策模拟...
  4. QSqlDatabase QMYSQL driver not loaded
  5. 十个经典免费软件和五★级网站![转]
  6. Python渗透脚本学习笔记
  7. JavaScript学习笔记(第二部分)总共四部分
  8. 吴恩达机器学习笔记(四)
  9. 玻色量子荣登《麻省理工科技评论》2021“50家聪明公司”榜单
  10. Keras学习笔记(四):MaxPooling1D和GlobalMaxPooling1D的区别