第07章 图(java版)
TRANSCRIPT
![Page 1: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/1.jpg)
《数据结构( Java 版)(第 3 版)》
第 7 章 图
7.1 图及其抽象数据类型
7.2 图的表示和实现
7.3 图的遍历
7.4 最小生成树
7.5 最短路径
![Page 2: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/2.jpg)
《数据结构( Java 版)(第 3 版)》
目的和要求• 目的:学习非线性的复杂数据结构——图。• 内容:图的概念、抽象数据类型、存储结构;
图 的深度和广度优先搜索遍历;最小生成树; 最短路径。
• 要求:掌握图的存储结构和操作实现。• 重点:图的两种存储结构,两种遍历算法,最
小 生成树,最短路径。• 难点:图的存储和操作实现,最小生成树,最
短 路径。• 实验:图的建立与遍历,最小代价生成
树,最短路径。
![Page 3: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/3.jpg)
《数据结构( Java 版)(第 3 版)》
7.1 图及其抽象数据类型 7.1.1 图的基本概念
1. 图的定义和术语 G=(V, E) V={ v i | v i ∈ 某个数据元素集合 }E={ (v i , v j) | v i ,v j∈V} 或 E = { 〈 v i , v j 〉 |v i ,v j∈V 且
Path(v i , v j)}a. 无向图 b. 有向图
![Page 4: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/4.jpg)
《数据结构( Java 版)(第 3 版)》
多重图和带自身环的图
![Page 5: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/5.jpg)
《数据结构( Java 版)(第 3 版)》
c. 完全图d. 带权图 e. 邻接顶点
1. 图的定义和术语
![Page 6: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/6.jpg)
《数据结构( Java 版)(第 3 版)》
2. 顶点的度
a. 无向图
b. 有向图degree()=indegree() + outdegree()
∑=
=n
iive
1
)(degree2
1
evvn
ii
n
ii == ∑∑
== 11
)(outdegree)(indegree
evvvn
ii
n
ii
n
ii 2)(outdegree)(indegree)(degree
111
=+= ∑∑∑===
![Page 7: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/7.jpg)
《数据结构( Java 版)(第 3 版)》
3. 子图
![Page 8: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/8.jpg)
《数据结构( Java 版)(第 3 版)》
4. 路径
5. 连通性
![Page 9: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/9.jpg)
《数据结构( Java 版)(第 3 版)》
7.1.2 图抽象数据类型public interface GGraph<T> // 图接口{ int vertexCount(); // 返回顶点数 T get(int i); // 返回顶点 vi
元素 int getWeight(int i, int j); // 返回边的权值 int insertVertex(T x); // 插入顶点 void insertEdge(int i, int j, int weight);// 插入
边 void removeVertex(int v); // 删除顶点 void removeEdge(int i, int j); // 删除边 int getNextNeighbor(int v, int w); / / 返回下一个
邻接顶点 }
![Page 10: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/10.jpg)
《数据结构( Java 版)(第 3 版)》
7.2 图的表示和实现
7.2.1 图的邻接矩阵表示和实现
7.2.2 图的邻接表表示和实现
7.2.3 图的邻接多重表表示
![Page 11: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/11.jpg)
《数据结构( Java 版)(第 3 版)》
7.2.1 图的邻接矩阵表示和实现
1. 邻接矩阵 ( 1 )不带权图的邻接矩阵
>∉<∉
>∈<∈=
EvvEvv
EvvEvva
jiji
jiji
ij,),(0
,),(1
或若
或若
=
E
D
C
B
A
V
=
01100
10111
11010
01101
01010
A
![Page 12: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/12.jpg)
《数据结构( Java 版)(第 3 版)》
( 2 )带权图的邻接矩阵
=
>∉<∉≠∞
>∈<∈≠
=
ji
jijiji
jijijiij
ij
vv
EvvEvvvv
EvvEvvvvw
a
若
或且若
或且若
0
,),(
,),(
![Page 13: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/13.jpg)
《数据结构( Java 版)(第 3 版)》
2. 邻接矩阵表示的带权图类
( 1 )带权值的边类public class Edge implements
Comparable<Edge> { public int start,dest,weight; // 边的起点序号、终点序号和权值}
![Page 14: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/14.jpg)
《数据结构( Java 版)(第 3 版)》
( 2 )邻接矩阵表示的带权图类
public class AdjMatrixGraph<T>{ SeqList<T> vertexlist;
// 顺序表存储图的顶点集合 int[][] adjmatrix; // 图的邻接矩阵 f inal int MAX_WEIGHT = 99999;
// 最大权值(表示无穷大∞)}
![Page 15: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/15.jpg)
《数据结构( Java 版)(第 3 版)》
( 2 )邻接矩阵表示的带权图类
顶点集合 {"A","B","C","D","E"}; 边集合 { (0,1,5), (0,3,2), (1,0,5), (1,2,7),
(1,3,6), (2,1,7), (2,3,8), (2,4,3), (3,0,2),(3,1,6), (3,2,8), (3,4,9), (4,2,3), (4,3,9)};
![Page 16: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/16.jpg)
《数据结构( Java 版)(第 3 版)》
( 3 )图的插入操作
![Page 17: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/17.jpg)
《数据结构( Java 版)(第 3 版)》
( 4 )图的删除操作
例 7.1 带权无向图的邻接矩阵表示及操作。
![Page 18: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/18.jpg)
《数据结构( Java 版)(第 3 版)》
7.2.2 图的邻接表表示和实现
1. 邻接表( 1 )无向图的邻接表表示
![Page 19: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/19.jpg)
《数据结构( Java 版)(第 3 版)》
( 2 )有向图的邻接表表示
![Page 20: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/20.jpg)
《数据结构( Java 版)(第 3 版)》
2. 邻接表表示的带权图类( 1 )顶点表元素类public class Vertex<T>{ T data; / / 顶点数据域 SortedSinglyLinkedList<Edge> adjl ink; / / 该顶点的边单链表}( 2 )邻接表表示的带权图类public class AdjListGraph<T>{ SeqList<Vertex<T>> vertexlist; / / 顶点顺序表}
![Page 21: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/21.jpg)
《数据结构( Java 版)(第 3 版)》
图 7-20 带权无向图的邻接表存储结构
![Page 22: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/22.jpg)
《数据结构( Java 版)(第 3 版)》
( 3 )图的插入操作
![Page 23: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/23.jpg)
《数据结构( Java 版)(第 3 版)》
( 4 )图的删除操作
例 7.2 带权有向图的构造、插入及删除操作。
![Page 24: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/24.jpg)
《数据结构( Java 版)(第 3 版)》
7.2.3 图的邻接多重表表示 1. 无向图的邻接多重表表示
![Page 25: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/25.jpg)
《数据结构( Java 版)(第 3 版)》
2. 有向图的邻接多重表表示
![Page 26: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/26.jpg)
《数据结构( Java 版)(第 3 版)》
7.3 图的遍历
7.3.1 图的深度优先搜索遍历
7.3.2 图的广度优先搜索遍历
![Page 27: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/27.jpg)
《数据结构( Java 版)(第 3 版)》
7.3.1 图的深度优先搜索遍历
DFS 策略,访问某个顶点 ,寻找的一个邻接顶点 访问 ,反复执行,走过一条较长路径到达最远顶点;若顶点没有未被访问的其他邻接顶点,则退回到前一个被访问顶点,再寻找其他访问路径。
ivjv
![Page 28: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/28.jpg)
《数据结构( Java 版)(第 3 版)》
抽象图类 public abstract class AbstractGraph<T>
implements GGraph<T>{ abstract int vertexCount(); // 返回顶点数 abstract T get(int i); // 返回顶点的数据
域 abstract int getNextNeighbor(int i , int j); void DFSTraverse(int i) // 深度优先搜索遍历 void BFSTraverse(int i) // 广度优先搜索遍
历}
![Page 29: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/29.jpg)
《数据结构( Java 版)(第 3 版)》
图接口、抽象图类和图类的层次关系
![Page 30: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/30.jpg)
《数据结构( Java 版)(第 3 版)》
邻接矩阵表示的图的遍历
// 邻接矩阵表示的图类,继承抽象图类public class AdjMatrixGraph<T> extends
AbstractGraph<T>{ int vertexCount() // 返回顶点数,前已实
现 T get(int i) // 返回顶点数据元素 int getNextNeighbor(int i , int j) // 返回在后的下一个邻接顶点序号}
![Page 31: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/31.jpg)
《数据结构( Java 版)(第 3 版)》
邻接表表示的图的遍历 // 邻接表表示的图类,继承抽象图类public class AdjListGraph<T> extends
AbstractGraph<T>{ int vertexCount() // 返回顶点数,前已实
现 T get(int i) // 返回顶点数据元素 int getNextNeighbor(int i, int j) // 返回在后的下一个邻接顶点序号}
![Page 32: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/32.jpg)
《数据结构( Java 版)(第 3 版)》
7.3.2 图的广度优先搜索遍历
BFS 策略,访问某个顶点 ,接着依次访问所有未被访问的邻接顶点 ,再依次访问 顶点的所有未被访问的其他邻接顶点,如此反复执行,直到访问完图中所有顶点。
ivtkj vvv ,,, tkj vvv ,,,
![Page 33: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/33.jpg)
《数据结构( Java 版)(第 3 版)》
7.4 最小生成树7.4.1 生成树
1. 树
![Page 34: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/34.jpg)
《数据结构( Java 版)(第 3 版)》
2. 生成树和生成森林
![Page 35: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/35.jpg)
《数据结构( Java 版)(第 3 版)》
3. 最小生成树
![Page 36: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/36.jpg)
《数据结构( Java 版)(第 3 版)》
7.4.2 最小生成树的构造算法1. Prim 算法
![Page 37: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/37.jpg)
![Page 38: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/38.jpg)
《数据结构( Java 版)(第 3 版)》
2.Kruskal 算法
![Page 39: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/39.jpg)
《数据结构( Java 版)(第 3 版)》
当图中有相同权值的边时,最小生成树不唯一
![Page 40: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/40.jpg)
《数据结构( Java 版)(第 3 版)》
7.5 最短路径
7.5.1 非负权值的单源最短路
径( Dijkstra 算法)
7.5.2 每对顶点间的最短路径
( Floyd 算法)
![Page 41: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/41.jpg)
《数据结构( Java 版)(第 3 版)》
7.5.1 非负权值的单源最短路径( Dijkstra 算法)
![Page 42: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/42.jpg)
《数据结构( Java 版)(第 3 版)》
表 7-1 求以 A 为源点的最短路径
源点
终点
最短路径及其长度变化
A
B (A,B) 10
C ∞- (A,B,C)
60(A,D,C)
50D (A,D) 30
E (A,E) 99 (A,D,E) 90
(A,D,C,E) 60
![Page 43: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/43.jpg)
![Page 44: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/44.jpg)
《数据结构( Java 版)(第 3 版)》
7.5.2 每对顶点间的最短路径( Floyd 算法)
1. 最短路径及其长度矩阵
=
≠∞
≠
=
ji
jiji
jijiij
ij
vv
vvvv
vvvvdist
d
若
没有路径到且从顶点若
有路径到且从顶点若
0
![Page 45: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/45.jpg)
《数据结构( Java 版)(第 3 版)》
图 7-37 带权有向图及其最短路径长度矩阵和最短路径矩阵
=
D
C
B
A
V
=
0493822
904731
2011042
3627160
D
−−
−−
=
1103
2103
2113
2101
P
),(),,,(),,(),(
),(),(),,,(),,(
),,(),(),(),,,(
),,,(),,(),(),(
DDCBADBADAD
DCCCBADCADC
DCBCBBBADCB
DCBACBABAAA
![Page 46: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/46.jpg)
《数据结构( Java 版)(第 3 版)》
2. Floyd 算法描述 a. D 的初值是邻接矩阵;
b. 迭代,每条路径 增加一个中间顶点
if ( )
{ ; // 用经过顶点的更短路径长度替换
; // 经过的最后一个顶点,替换为 经过的最后一个顶点
}
c. 以图 G 中每个顶点作为其他路径的中间顶点,对每条路径进行上述迭代。
ijkjik ddd <+
kjikij ddd +=
kv
kjij pp = ),,( ji vv
),,( jk vv
kv),,( ji vv
![Page 47: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/47.jpg)
《数据结构( Java 版)(第 3 版)》
以 A 作为其他边的中间顶点,调整 D 和 P 矩阵
7G
∞
=
0793822
905539
43110
6557160
D
−−
−−−
=
1003
2102
1111
0001
P
),(),,(),,(),(
),(),(),,(),(
),(),(),(),(
),(),(),(),(
DDCADBADAD
DCCCBACAC
DBCBBBAB
DACABAAA
![Page 48: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/48.jpg)
《数据结构( Java 版)(第 3 版)》
以 B 作为其他边的中间顶点,调整 D 和 P 矩阵
7G
∞
=
0493822
905539
43110
5927160
D
−−
−−−
=
1103
2102
1111
1101
P
),(),,,(),,(),(
),(),(),,(),(
),(),(),(),(
),,(),,(),(),(
DDCBADBADAD
DCCCBACAC
DBCBBBAB
DBACBABAAA
![Page 49: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/49.jpg)
《数据结构( Java 版)(第 3 版)》
以 C 作为其他边的中间顶点,调整 D 和 P 矩阵
7G
=
0493822
905539
2011050
3627160
D
−−
−−
=
1103
2102
2112
2101
P
),(),,,(),,(),(
),(),(),,(),(
),,(),(),(),,(
),,,(),,(),(),(
DDCBADBADAD
DCCCBACAC
DCBCBBBACB
DCBACBABAAA
![Page 50: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/50.jpg)
《数据结构( Java 版)(第 3 版)》
以 D 作为其他边的中间顶点,调整 D 和 P 矩阵
7G
=
0493822
904731
2011042
3627160
D
−−
−−
=
1103
2103
2113
2101
P
),(),,,(),,(),(
),(),(),,,(),,(
),,(),(),(),,,(
),,,(),,(),(),(
DDCBADBADAD
DCCCBADCADC
DCBCBBBADCB
DCBACBABAAA
![Page 51: 第07章 图(java版)](https://reader033.vdocuments.net/reader033/viewer/2022052205/559b6b6f1a28ab32188b4748/html5/thumbnails/51.jpg)
《数据结构( Java 版)(第 3 版)》
从 P 矩阵可获得每条最短路径经过的顶点序列
因 =1 ,可知最短路径为 (D,…,B,C)因 =0 ,可知最短路径为 (D,…,A,B,C)因 =3 ,可知最短路径为 (D,A,B,C) ,路
径长度为 =49
−−
−−
=
1103
2103
2113
2101
P