图论算法 有图有代码 万字总结

本文详细介绍了图论中的基本概念,包括图的定义、存储方式和基本操作。重点讲解了图的深度优先搜索(DFS)和广度优先搜索(BFS),并探讨了这两种算法在判断连通性、求解最短路径、拓扑排序等问题中的应用。同时,文章涵盖了Dijkstra算法、网络流问题、活动网络分析、最小生成树的Prim、Kruskal和Sollin算法。通过实例和伪代码,帮助读者理解这些算法的工作原理和应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

图的定义

背景知识

看到这篇博客相信一开始映入读者眼帘的就是下面这幅图了,这就是传说中的七桥问题(哥尼斯堡桥问题)。在哥尼斯堡,普雷格尔河环绕着奈佛夫岛(图中的A岛)。这条河将陆地分成了下面4个区域,该处还有着7座连接这些陆地的桥梁。

这里写图片描述

问题是如何从某地出发,依次沿着各个桥,必须经过每座桥且每座桥只能经过1次,最终回到原地。

不知道这个问题且好奇的童鞋现在肯定在忙活着找出来这道题的结果了。

是伟大的数学家欧拉(Leonhard Euler)在1736年首次使用图的方法解决了该问题。

欧拉将上面的模型转换成了下面这种”图“的形式。

这里写图片描述

欧拉把顶点的度定义为与该顶点相关联的边的条数,并且他证明了存在从任意点出发,经过所有边恰好一次,并最终回到出发顶点的走法的充分必要条件是:每个顶点的度均为偶数。人们称之为欧拉闭迹(Eulerian walk)。

简要定义

( g r a p h ) G = ( V , E ) (graph)G = (V,E) graphG=VE由顶点(vertex)的集 V V V和边(Edge)的集 E E E组成。顶点代表了对象,在示意图中我们使用点或圆来表示它;边代表了两个对象的连接关系,在示意图中我们使用连接两顶点的线段来表示。

有时也把边称作弧(arc),如果点对 ( v , w ) (v,w) vw是有序的,那么图就叫做有向的图(有向图)。如果点对$ (v, w) $是无序的,那么图就叫做无向的图(无向图)。简单的讲,边没有指向性的图叫做无向图,边具有指向性的图叫做有向图。

顶点 v v v w w w邻接(adjacent)当且仅当 ( v , w ) (v,w) vw属于 E E E

我们可以给边赋予各式的属性,比如权值(cost)。权值可以表示从一个顶点到另一个顶点的距离,也可以表示一个顶点到另一个顶点说话费的代价(比如时间、金钱等)。一个边上带权值的图称为网络(network)。

如果无向图中从每一个顶点到其他每个顶点都存在一条路径,则称该无向图是连通的(connected)。具有这样性质的有向图称为是强连通的的(strongly connected)。如果有向图不是强连通的,但它的基础图(underlying graph)(也就是其弧上去掉方向说形成的图)是连通的,那么称该有向图是弱连通的(weakly connected)。完全图(complete graph)是其每一对顶点间都存在一条边的图。

这里写图片描述

所谓入度(indegree)是指的顶点 v v v的边 ( u , v ) (u,v) uv的条数。

这里写图片描述

如下表示了一个有着7个顶点和12条边的有向图。

这里写图片描述

如果具有n个顶点,e条边的图G的顶点i的度为 d i d_i di,则G的边数为:

$ e =\frac { \sum_{0}^{n-1} d_i} {2} $

以上这个数学公式的markdown“源码”:
$ e =\frac { \sum_{0}^{n-1} d_i} {2} $

现在将图看作抽象数据类型,下面给出ADT图的结构:

objects 一个非空顶点的集合和一个无向边的集合,其中每条边都是一个顶点对
functions 对于所有的 $ graph \in Graph $ ,$ v , , v_1 , , v_2 \in Vertices $
Graph Create() return一个空图
Graph InsertVertex (graph, v) 向图graph中插入没有关联边的新顶点v,return改变后的图
Graph InsertEdge (graph, $ v_1 , , v_2 $) 在图graph的顶点 v 1 v_1 v1 v 2 v_2 v2之间插入一条边,return改变后的图
Graph DeleteVertex (graph, v) 删除图graph的顶点v及与其关联的所有边,return改变后的图
Graph DeleteEdge (graph, v 1 v_1 v1 v 2 v_2 v2) 删除图graph的边( v 1 v_1 v1, v 2 v_2 v2),顶点 v 1 v_1 v1, v 2 v_2 v2不删除,return改变后的图
Boolean IsEmpty (graph) if(graph==空图) return TRUE,else return FALSE
List Adjacent (graph, v) return顶点v的所有邻接结点

图的存储表示方式

图主要有3种常用的存储表示方式:邻接矩阵(adjacency matrices),邻接表(adjacency lists),邻接多重表(adjacency multilists)。

邻接矩阵

邻接矩阵使用 ∣ V ∣ ∗ ∣ V ∣ |V|*|V| VV的二维数组来表示图。 g [ i ] [ j ] g[i][j] g[i][j]表示的是顶点 i i i和顶点 j j j的关系。

1)因为在无向图中,我们只需要知道顶点 i i i和顶点 j j j是否是相连的,因此我们只需要将 g [ i ] [ j ] g[i][j] g[i][j] g [ j ] [ j ] g[j][j] g[j][j]设置为1或是0表示相连或不相连即可。如下图所示。

这里写图片描述

2)而在有向图中,我们只需要知道是否有从顶点 i i i到顶点 j j j的边,因此如果顶点 i i i有一条指向顶点 j j j的边,那么 g [ i ] [ j ] g[i][j] g[i][j]就设为1,否则设为0。有向图与无向图不同,并不需要满足 g [ i ] [ j ] = g [ j ] [ i ] g[i][j]=g[j][i] g[i][j]=g[j][i]

这里写图片描述

3)在带权值的图中, g [ i ] [ j ] g[i][j] g[i]

评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值