图的表示方法

图的基本概念

可以分为 有向图、无向图、有权图 和 无权图

图的遍历:
DFS
BFS

常见可以解决的问题有
联通分量,Flood Fill,寻路,走迷宫,迷宫生成,无权图的最短路径,环的判断
最小生成树问题(Minimum Spanning Tree):Prim,Kruskal
最短路径问题(Shortest Path):Dijkstra,Bellman-Ford
拓扑排序(Topological sorting)

基本概念

顶点(Vertex)
(Edge)
路径:比如在无向图 G 中,存在一个顶点序列 Vp,Vi1,Vi2,Vi3 …,Vim,Vq,使得(Vp,Vi1),(Vi1,Vi2),…,(Vim,Vq)均属于边集 E(G) ,则称顶点 Vp 到 Vq 存在一条路径。
路径长度:是指一条路径上经过的边的数量。
回路:指一条路径的起点和终点为同一个顶点。
顶点的度

无向图:顶点的度表示以该顶点作为一个端点的边的数目。
有向图:顶点的度分为入度和出度:该顶点的度等于其入度和出度之和

不管是无向图还是有向图,顶点数 n,边数 e 和顶点的度数 D(Vi)有如下关系:
*e = 1/2 (D(v1) + D(v2) + … + D(vn))

特殊概念:

:顶点的度数(degree)即依附于它的边的数量。


平行边:有两条边连接同样的同个顶点。英文称作:parallel。
相邻:两个顶点由一条边相连,则说这两个顶点相邻(adjacent)。而这条边认为是依附(incident)于这两个顶点。

路径
路径:由边顺序连接的一系列顶点。英文称作:path。
简单路径:没有重复顶点的路径。英文称作:simple path。
路径的长度:路径或环包含的边的数量。
路径的表示:用 u-v-w-x 表示 u 到 x 的一条路径。


环:至少含有一条边且起点和终点相同的一条路径。英文称作 circle。
简单环:不含有重复顶点和边的环。英文称作 simple circle。
自环:有一条边连接一个顶点和其自身。英文称作:self-loop。
环的长度:路径或环包含的边的数量。
环的表示:用 u-v-w-x-u 表示 u 到 u 的一条环。

两个顶点连通:当两个顶点之间存在一条连通的路径时,称这两个顶点是连通的。英文称作:connected。


多重图:含有平行边的图。
简单图:不含平行边或自环的图。
子图:一幅的边及相连接的顶点的一个子集组成的图,特别是顺序连接一系列顶点的边组成的子图。英文称作:subgraph。
连通图:如果任意两个顶点都存在一条连通路径,则这幅图是连通图。
非连通图:由若于个极大连通子图组成。
无环图:不包括环的图。英文称作:acyclic graph。

树与森林
生成树:边通图的生成树(spanning tree )是它的一幅子图。它含有图中的所有顶点,且是一棵树。
森林:树是一个无环连通图,互不相连的树组成的集合叫作 森林。英文称作:disjoint set of trees。
生成树森林:是图的所有连通子图的生成树(union of the spanning trees )的集合。

图的表示

边的集合表示:
无权图可以使用二元组 <Vp, Vq>
有权图可以使用三元组 <Vp, Vq, weight>

图的表示: 邻接表 和 邻接矩阵

邻接矩阵 Adjacency matrices
二维数组adj[i][j] = 1 or weight
在这里插入图片描述

邻接表 Adjacency lists
邻接表是图的一种链式存储结构。这种存储结构类似于树的孩子链表。
对于图 G 中每个顶点 Vi,把所有邻接于 Vi 的顶点 Vj 链成一个单链表,这个单链表称为顶点 Vi 的邻接表。
在这里插入图片描述

图的遍历

DFS
BFS

深度或广度优先搜索算法,费罗伊德算法,迪杰斯特拉算法,Bellman-Ford 算法。

深度或广度优先搜索算法(解决单源最短路径)

从起点开始访问所有深度遍历路径或广度优先路径,则到达终点节点的路径有多条,取其中路径权值最短的一条则为最短路径。

弗洛伊德算法(解决多源最短路径)

时间复杂度o(n3),空间复杂度o(n2)

基本思想:最开始只允许经过1号顶点进行中转,接下来只允许经过1号和2号顶点进行中转…允许经过1~n号所有顶点进行中转,来不断动态更新任意两点之间的最短距离。即求从i号顶点到j顶点只经过前k号点的最短距离。

迪杰斯特拉算法(解决单源最短路径)

基本思想:每次找到离源点(如1号节点)最近的一个顶点,然后以该顶点为中心进行扩展,最终得到源点到其余所有点的最短路径。

1,设置标记数组book[]:将所有的顶点分为两部分,已知最短路径的顶点集合P和未知最短路径的顶点集合Q,很显然最开始集合P只有源点一个顶点。book[i]为1表示在集合P中;
2,设置最短路径数组dst[]并不断更新:初始状态下,dst[i]=edge[s]i,很显然此时dst[s]=0,book[s]=1.此时,在集合Q中可选择一个离源点s最近的顶点u加入到P中。并依据以u为新的中心点,对每一条边进行松弛操作(松弛是指由顶点s–>j的途中可以经过点u,并令dst[j]=min(dst[j],dst[u]+edge[u][j])),并令book[u]=1;
3,在集合Q中再次选择一个离源点s最近的顶点v加入到P中。并依据v为新的中心点,对每一条边进行松弛操作(即dst[j]=min(dst[j],dst[v]+edge[v][j])),并令book[v]=1;
4,重复3,直至集合Q为空。

Bellman-Ford算法(解决负权边,解决单源最短路径,前几种方法不能解决负权边)

主要思想:所有的边进行n-1轮松弛,因为在一个含有n个顶点的图中,任意两点之间的最短路径最多包含n-1条边。换句话说,第1轮在对所有的边进行松弛操作后,得到从1号顶点只能经过一条边到达其余各定点的最短路径长度,第2轮在对所有的边进行松弛操作后,得到从1号顶点只能经过两条边到达其余各定点的最短路径长度,…

此外,Bellman-Ford算法可以检测一个图是否含有负权回路:如果经过n-1轮松弛后任然存在dst[e[i]]>dst[s[i]]+w[i].

SPFA(Shortest Path Faster Algorithm)(单源最短路径)

它是Bellman-ford队列优化,它是一种十分高效的最短路算法。

实现方法:建立一个队列,初始时队列里只有起始点s,在建立一个数组记录起始点s到所有点的最短路径(初始值都要赋为极大值,该点到他本身的路径赋为0)。然后执行松弛操作,用队列里的点去刷新起始点s到所有点的距离的距离,如果刷新成功且刷新的点不在队列中,则把该点加入到队列,重复执行直到队列为空。

此外,SPFA算法可以判断图中是否有负权欢=环,即一个点的入队次数超过N

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值