无向图的深度优先遍历非递归_图算法总结

@[TOC]

图算法

1、图的表示

1.1、邻接矩阵(有向图、无向图、带权图、代码实现)

1、无向图的邻接矩阵

7e142e44eedfedc9136e19e72e05b790.png

2、有向图的邻接矩阵

f490216039af6cf467e61831c90306cf.png

3、带权值的图

a4eb718e116903a5e40e0b6a794ef278.png

有了上述的理解,我们可以设计数据结构,并实现了。C++实现如下:

#include

db5e09521dec3a219677a6ad04ef9531.png

974eb9b4901896e70a470833fc670c49.png

1.2、 邻接表

1、邻接表的提出

0fe5269b9fcd4cafba2330b6721f7ab8.png

2、无向图的邻接表

3e4ea87077694251056821b4c941c1a3.png

16da7687f51b8ccbc1e822820e54bc22.png

3、有向图的邻接表(分出边表、入边表)

ef3895f55004e5d5d9a8697e588db8f2.png

4、带权图的处理

ac7a1d5fa78a3d40c72cdd0f61c30b7a.png

有了上面的邻接表的理解,我们可以实现代码(java):

package 

febe9e1c3a7fc2212b510a39f245ac14.png

7825837187b15aab8ddf51509181189c.png

c5d7b22b12752927caa80407b19afcdc.png

1.3、 十字链表与邻接多重表

1、十字链表——解决有向图邻接表结构缺点

e3714e097ed4cb54dc463088d742f559.png

8aaddb95e0ca869993bbef903903ae6e.png

2、邻接多重表——解决无向图邻接表结构,边的删除麻烦问题

45dd8b685264a7ad1fa9742ef89264db.png

f232f7850d05e4abb616d245a5e78963.png

70e4580fcc5e41145da13f773b114cee.png

1.4、边集数组

148c7334031d91f8435e0fcd8ded4616.png

2、图的遍历

2.1、DFS(深度优先搜索、递归算法)

a179aedc45a9ee2b8788624ce5f7a175.png

b2ba31862ebd13c61179878cbfc000c0.png

基于邻接矩阵的DFS

template

由于是邻接矩阵存储结构,算法时间复杂度O(n^2^)

基于邻接表的DFS

template

邻接表使得算法复杂度为O(n+e),n为顶点个数,e为边数。

2.2、BFS(宽度优先搜索、优先队列)

bba83fb416462c075738ba954ecfa2f7.png

bc407814c370dc3a00630514ba31ab4c.png

对边搜索、不断延展。 邻接矩阵的BFS

void 

邻接表的BFS

void 

2.3、小结

24c0b889613d2e1dd52d390ccc417d30.png

3、寻找最小生成树(两个贪心算法)

实际问题:

e97017e730ff9030a7e8dfc7d39b8117.png

27333181bc77719dfc76793ee31ea664.png

ff878276404b5a307a0356eda6d12961.png

3.1、Prim算法(分割法、贪心策略:寻找集合中的顶点所连接边中最小权值边)

4cbdb737f4d1677649d9dbfeea417b43.png

贪心策略、算法分析

23934ebb6042f31f06cc91551f7b0613.png
template

6d7cf938281bc0e21990a38ca95cf7e7.png

3.2、 Kruskal算法(边集数组、每次从剩余边选择最小权值边)

f335e633758bf81f5b3bd893a916657d.png

图解分析:

7e6177cdf45ac9c80bc2630c834634ad.png

基于分析我们可以写出代码:

template

运行结果:

8efb4b7c88b764571152ed0c2d2f0e65.png

4、最短路径问题

2734933235a76177091cfb12c5523336.png

5820ab70dc0188dd166bea7f9dcb86c2.png

66ff1a7c90369a1d38b80fb2504c5528.png

4.1、单源最短路径问题(给定一个点,求到其余各个点的距离)

4.1.1、迪杰特斯拉(Dijkstra)算法(贪心算法)

很像prim算法,利用集合,寻找最短路径。但是有区别。而且用途也不同。这是一个贪心算法。

b03e51ed5f4ecc4ca3fdaaca3d229004.png

基于理解上的算法实现 :

template

ec148a5a3f54fa01fed596ea3a2ad2b5.png

未优化的算法复杂度很高

f7c9ec147c2d279d2c5fa050c7dc218b.png

4.1.2、Floyd算法(动态规划)

b5938abffe030f992bdf07ae1c1e6f76.png

6dbaf2b92e36f9ac8c35a868ab0e643b.png

4.1.3、Bellman-Ford 算法

1dda5a65e6738d20aee42265802a6271.png

bf5d0b3c88f4a8cda6dc0c7afd805a66.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值