SlideShare a Scribd company logo
1 of 51
第 7 章 图
 7.1 图及其抽象数据类型
 7.2 图的表示和实现
 7.3 图的遍历
 7.4 最小生成树
 7.5 最短路径
目的和要求
• 目的:学习非线性的复杂数据结构——图。
• 内容:图的概念、抽象数据类型、存储结构;
图 的深度和广度优先搜索遍历;最小生成
树; 最短路径。
• 要求:掌握图的存储结构和操作实现。
• 重点:图的两种存储结构,两种遍历算法,最
小 生成树,最短路径。
• 难点:图的存储和操作实现,最小生成树,最
短 路径。
• 实验:图的建立与遍历,最小代价生成
树,最短路径。
《数据结构( Java 版)(第 3 版)》
7.1 图及其抽象数据类型
7.1.1 图的基本概念
1. 图的定义和术语 G=(V, E)
V={ vi | vi ∈ 某个数据元素集合 }
E={ (vi , vj) | vi ,vj∈V} 或 E = { 〈 vi , vj 〉 |vi ,vj∈V 且
Path(vi , vj)}
a. 无向图
b. 有向图
《数据结构( Java 版)(第 3 版)》
多重图和带自身环的图
《数据结构( Java 版)(第 3 版)》
c. 完全图
d. 带权图
e. 邻接顶点
1. 图的定义和术语
《数据结构( Java 版)(第 3 版)》
2. 顶点的度
a. 无向图
b. 有向图
degree()=indegree() + outdegree()
∑=
=
n
i
ive
1
)(degree
2
1
evv
n
i
i
n
i
i == ∑∑ == 11
)(outdegree)(indegree
evvv
n
i
i
n
i
i
n
i
i 2)(outdegree)(indegree)(degree
111
=+= ∑∑∑ ===
《数据结构( Java 版)(第 3 版)》
3. 子图
《数据结构( Java 版)(第 3 版)》
4. 路径
5. 连通性
《数据结构( 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); // 删除边
《数据结构( Java 版)(第 3 版)》
7.2 图的表示和实现
7.2.1 图的邻接矩阵表示和实现
7.2.2 图的邻接表表示和实现
7.2.3 图的邻接多重表表示
《数据结构( Java 版)(第 3 版)》
7.2.1 图的邻接矩阵表示和实
现
1. 邻接矩阵
( 1 )不带权图的邻接矩阵




>∉<∉
>∈<∈
=
EvvEvv
EvvEvv
a
jiji
jiji
ij
,),(0
,),(1
或若
或若
















=
E
D
C
B
A
V
















=
01100
10111
11010
01101
01010
A
《数据结构( Java 版)(第 3 版)》
( 2 )带权图的邻接矩阵





=
>∉<∉≠∞
>∈<∈≠
=
ji
jijiji
jijijiij
ij
vv
EvvEvvvv
EvvEvvvvw
a
若
或且若
或且若
0
,),(
,),(
《数据结构( Java 版)(第 3 版)》
2. 邻接矩阵表示的带权图类
( 1 )带权值的边类
public class Edge implements
Comparable<Edge>
{
public int start,dest,weight;
// 边的起点序号、终点序号和权值
}
《数据结构( Java 版)(第 3 版)》
( 2 )邻接矩阵表示的带权
图类
public class AdjMatrixGraph<T>
{
SeqList<T> vertexlist;
// 顺序表存储图的顶点集合
int[][] adjmatrix; // 图的邻接矩阵
final int MAX_WEIGHT = 99999;
// 最大权值(表示无穷大∞)
}
《数据结构( 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)};
《数据结构( Java 版)(第 3 版)》
( 3 )图的插入操作
《数据结构( Java 版)(第 3 版)》
( 4 )图的删除操作
例 7.1 带权无向图的邻接矩阵表示及操作。
《数据结构( Java 版)(第 3 版)》
7.2.2 图的邻接表表示和
实现
1. 邻接表
( 1 )无向图的邻接表表示
《数据结构( Java 版)(第 3 版)》
( 2 )有向图的邻接表表示
《数据结构( Java 版)(第 3 版)》
2. 邻接表表示的带权图类
( 1 )顶点表元素类
public class Vertex<T>
{ T data; // 顶点数据域
SortedSinglyLinkedList<Edge> adjlink;
// 该顶点的边单链表
}
( 2 )邻接表表示的带权图类
public class AdjListGraph<T>
{
SeqList<Vertex<T>> vertexlist; // 顶点顺序表
}
《数据结构( Java 版)(第 3 版)》
图 7-20 带权无向图的邻接表存储
结构
《数据结构( Java 版)(第 3 版)》
( 3 )图的插入操作
《数据结构( Java 版)(第 3 版)》
( 4 )图的删除
操作
例 7.2 带权有向图的构造、插入及删除操作
《数据结构( Java 版)(第 3 版)》
7.2.3 图的邻接多重表表示
1. 无向图的邻接多重表表示
《数据结构( Java 版)(第 3 版)》
2. 有向图的邻接多重表表示
《数据结构( Java 版)(第 3 版)》
7.3 图的遍历
7.3.1 图的深度优先搜索遍历
7.3.2 图的广度优先搜索遍历
《数据结构( Java 版)(第 3 版)》
7.3.1 图的深度优先搜索遍历
DFS 策略,访问某个顶点 ,寻找的一个邻接顶
点 访问 ,反复执行,走过一条较长路径
到达最远顶点;若顶点没有未被访问的其他邻接顶
点,则退回到前一个被访问顶点,再寻找其他访问
路径。
iv
jv
《数据结构( 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) // 广度优先搜索遍
历
《数据结构( Java 版)(第 3 版)》
图接口、抽象图类和图类的层
次关系
《数据结构( Java 版)(第 3 版)》
邻接矩阵表示的图的遍历
// 邻接矩阵表示的图类,继承抽象图类
public class AdjMatrixGraph<T> extends
AbstractGraph<T>
{
int vertexCount() // 返回顶点数,前已实
现
T get(int i) // 返回顶点数据元素
int getNextNeighbor(int i, int j)
// 返回在后的下一个邻接顶点序号
}
《数据结构( Java 版)(第 3 版)》
邻接表表示的图的遍历
// 邻接表表示的图类,继承抽象图类
public class AdjListGraph<T> extends
AbstractGraph<T>
{
int vertexCount() // 返回顶点数,前已实
现
T get(int i) // 返回顶点数据元素
int getNextNeighbor(int i, int j)
// 返回在后的下一个邻接顶点序号
}
《数据结构( Java 版)(第 3 版)》
7.3.2 图的广度优先搜索遍历
BFS 策略,访问某个顶点 ,接着依次访问所有未
被访问的邻接顶点 ,再依次访问
顶点的所有未被访问的其他邻接顶点,如此反复
执行,直到访问完图中所有顶点。
iv
tkj vvv ,,,  tkj vvv ,,, 
《数据结构( Java 版)(第 3 版)》
7.4 最小生成树
7.4.1 生成树
1. 树
《数据结构( Java 版)(第 3 版)》
2. 生成树和生成森林
《数据结构( Java 版)(第 3 版)》
3. 最小生成树
《数据结构( Java 版)(第 3 版)》
7.4.2 最小生成树的构造算法
1. Prim 算法
《数据结构( Java 版)(第 3 版)》
2.Kruskal 算法
《数据结构( Java 版)(第 3 版)》
当图中有相同权值的边时,最
小生成树不唯一
《数据结构( Java 版)(第 3 版)》
7.5 最短路径
7.5.1 非负权值的单源最短路
径( Dijkstra 算法)
7.5.2 每对顶点间的最短路径
( Floyd 算法)
《数据结构( Java 版)(第 3 版)》
7.5.1 非负权值的单源最
短路径( Dijkstra 算法)
《数据结构( Java 版)(第 3 版)》
表 7-1 求以 A 为源点的最短
路径
源
点
终
点
最短路径及其长度变化
A
B (A,B) 10
C
∞- (A,B,C)
60
(A,D,C)
50
D (A,D) 30
E
(A,E) 99 (A,D,E)
90
(A,D,C,E)
60
《数据结构( Java 版)(第 3 版)》
7.5.2 每对顶点间的最短路径
( Floyd 算法)
1. 最短路径及其长度矩阵





=
≠∞
≠
=
ji
jiji
jijiij
ij
vv
vvvv
vvvvdist
d
若
没有路径到且从顶点若
有路径到且从顶点若
0
《数据结构( Java 版)(第 3 版)》
图 7-37 带权有向图及其最短
路径长度矩阵和最短路径矩阵












=
D
C
B
A
V












=
0493822
904731
2011042
3627160
D












−
−
−
−
=
1103
2103
2113
2101
P












),(),,,(),,(),(
),(),(),,,(),,(
),,(),(),(),,,(
),,,(),,(),(),(
DDCBADBADAD
DCCCBADCADC
DCBCBBBADCB
DCBACBABAAA
《数据结构( Java 版)(第 3 版)》
2. Floyd 算法描述
a. D 的初值是邻接矩阵;
b. 迭代,每条路径 增加一个中间顶
点
if ( )
{ ; // 用经过顶点的更短路径长度
替换
; // 经过的最后一个
顶点,替换为 经过的最后一个顶
点
ijkjik ddd <+
kjikij ddd +=
kv
kjij pp = ),,( ji vv 
),,( jk vv 
kv),,( ji vv 
《数据结构( Java 版)(第 3 版)》
以 A 作为其他边的中间顶点,
调整 D 和 P 矩阵
7G












∞
=
0793822
905539
43110
6557160
D












−
−
−−
−
=
1003
2102
1111
0001
P












),(),,(),,(),(
),(),(),,(),(
),(),(),(),(
),(),(),(),(
DDCADBADAD
DCCCBACAC
DBCBBBAB
DACABAAA
《数据结构( Java 版)(第 3 版)》
以 B 作为其他边的中间顶点,
调整 D 和 P 矩阵
7G












∞
=
0493822
905539
43110
5927160
D












−
−
−−
−
=
1103
2102
1111
1101
P












),(),,,(),,(),(
),(),(),,(),(
),(),(),(),(
),,(),,(),(),(
DDCBADBADAD
DCCCBACAC
DBCBBBAB
DBACBABAAA
《数据结构( Java 版)(第 3 版)》
以 C 作为其他边的中间顶点,
调整 D 和 P 矩阵
7G












=
0493822
905539
2011050
3627160
D












−
−
−
−
=
1103
2102
2112
2101
P












),(),,,(),,(),(
),(),(),,(),(
),,(),(),(),,(
),,,(),,(),(),(
DDCBADBADAD
DCCCBACAC
DCBCBBBACB
DCBACBABAAA
《数据结构( Java 版)(第 3 版)》
以 D 作为其他边的中间顶点,
调整 D 和 P 矩阵
7G












=
0493822
904731
2011042
3627160
D












−
−
−
−
=
1103
2103
2113
2101
P












),(),,,(),,(),(
),(),(),,,(),,(
),,(),(),(),,,(
),,,(),,(),(),(
DDCBADBADAD
DCCCBADCADC
DCBCBBBADCB
DCBACBABAAA
《数据结构( Java 版)(第 3 版)》
从 P 矩阵可获得每条最短路径
经过的顶点序列
因 =1 ,可知最短路径为 (D,…,B,C)
因 =0 ,可知最短路径为 (D,…,A,B,C)
因 =3 ,可知最短路径为 (D,A,B,C) ,路
径长度为 =49












−
−
−
−
=
1103
2103
2113
2101
P

More Related Content

Viewers also liked

成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片
成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片
成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片vincent8899
 
Bit iit submission_form_chan nga mei_10029066
Bit iit submission_form_chan nga mei_10029066Bit iit submission_form_chan nga mei_10029066
Bit iit submission_form_chan nga mei_10029066ngamei
 
Phillips Building Communities Isummit 2007
Phillips   Building Communities   Isummit 2007Phillips   Building Communities   Isummit 2007
Phillips Building Communities Isummit 2007Jon Phillips
 
盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)
盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)
盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)Delta Electronics Foundation
 
20120223 民宿介紹
20120223 民宿介紹20120223 民宿介紹
20120223 民宿介紹LIN JACK
 
QM-057-品質顧問生涯經驗分享
QM-057-品質顧問生涯經驗分享QM-057-品質顧問生涯經驗分享
QM-057-品質顧問生涯經驗分享handbook
 
World Mobile Congress 2013 : Les temps forts / Jour 1
World Mobile Congress 2013 : Les temps forts / Jour 1World Mobile Congress 2013 : Les temps forts / Jour 1
World Mobile Congress 2013 : Les temps forts / Jour 1Care
 
Dbh 4 amaierako aukerak
Dbh 4 amaierako aukerakDbh 4 amaierako aukerak
Dbh 4 amaierako aukeraketxebazter
 
數位城邦計畫2006
數位城邦計畫2006數位城邦計畫2006
數位城邦計畫2006Alex Lee
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研lorisjand
 
Listado de Carrera Magisterial Etapa XXI (Nayarit)
Listado de Carrera Magisterial Etapa XXI (Nayarit)Listado de Carrera Magisterial Etapa XXI (Nayarit)
Listado de Carrera Magisterial Etapa XXI (Nayarit)Emilio Armando Acosta
 
The White Balance portfolio
The White Balance portfolioThe White Balance portfolio
The White Balance portfolioguestef49836b
 

Viewers also liked (18)

成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片
成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片
成功戰將的策略與哲學~企業經營大師黃聰亮教授演講投影片
 
Bit iit submission_form_chan nga mei_10029066
Bit iit submission_form_chan nga mei_10029066Bit iit submission_form_chan nga mei_10029066
Bit iit submission_form_chan nga mei_10029066
 
Aalborg23 01 2
Aalborg23 01 2Aalborg23 01 2
Aalborg23 01 2
 
redes informáticas IES huelin
redes informáticas  IES huelinredes informáticas  IES huelin
redes informáticas IES huelin
 
Phillips Building Communities Isummit 2007
Phillips   Building Communities   Isummit 2007Phillips   Building Communities   Isummit 2007
Phillips Building Communities Isummit 2007
 
How does it work?
How does it work?How does it work?
How does it work?
 
盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)
盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)
盧韻竹_討論文件46號:基礎能力建設組(Capacity Building)
 
20120223 民宿介紹
20120223 民宿介紹20120223 民宿介紹
20120223 民宿介紹
 
QM-057-品質顧問生涯經驗分享
QM-057-品質顧問生涯經驗分享QM-057-品質顧問生涯經驗分享
QM-057-品質顧問生涯經驗分享
 
World Mobile Congress 2013 : Les temps forts / Jour 1
World Mobile Congress 2013 : Les temps forts / Jour 1World Mobile Congress 2013 : Les temps forts / Jour 1
World Mobile Congress 2013 : Les temps forts / Jour 1
 
Dbh 4 amaierako aukerak
Dbh 4 amaierako aukerakDbh 4 amaierako aukerak
Dbh 4 amaierako aukerak
 
數位城邦計畫2006
數位城邦計畫2006數位城邦計畫2006
數位城邦計畫2006
 
滿漢對譯
滿漢對譯滿漢對譯
滿漢對譯
 
Twitter
TwitterTwitter
Twitter
 
Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研Jdbc4 0 规范技术预研
Jdbc4 0 规范技术预研
 
Applications For Learning
Applications For LearningApplications For Learning
Applications For Learning
 
Listado de Carrera Magisterial Etapa XXI (Nayarit)
Listado de Carrera Magisterial Etapa XXI (Nayarit)Listado de Carrera Magisterial Etapa XXI (Nayarit)
Listado de Carrera Magisterial Etapa XXI (Nayarit)
 
The White Balance portfolio
The White Balance portfolioThe White Balance portfolio
The White Balance portfolio
 

Similar to 第07章 图(java版)

第10章 综合应用设计(java版)
第10章  综合应用设计(java版)第10章  综合应用设计(java版)
第10章 综合应用设计(java版)Yan Li
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)Yan Li
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)Yan Li
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)Yan Li
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)Yan Li
 
第08章 查找(java版)
第08章  查找(java版)第08章  查找(java版)
第08章 查找(java版)Yan Li
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)Yan Li
 
机器学习V10baochang svm
机器学习V10baochang svm机器学习V10baochang svm
机器学习V10baochang svmShocky1
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developerdianming.song
 
卷積神經網路(Python+TensorFlow+Keras)
卷積神經網路(Python+TensorFlow+Keras)卷積神經網路(Python+TensorFlow+Keras)
卷積神經網路(Python+TensorFlow+Keras)Fuzhou University
 
ncuma_pylab.pptx
ncuma_pylab.pptxncuma_pylab.pptx
ncuma_pylab.pptxNCU MCL
 
数据结构回顾
数据结构回顾数据结构回顾
数据结构回顾Zehua HONG
 
Ch3第三單元
Ch3第三單元Ch3第三單元
Ch3第三單元zhan160
 
Tutorial of cnn 赵子健9.16
Tutorial of cnn 赵子健9.16Tutorial of cnn 赵子健9.16
Tutorial of cnn 赵子健9.16Zijian Zhao
 

Similar to 第07章 图(java版) (15)

第10章 综合应用设计(java版)
第10章  综合应用设计(java版)第10章  综合应用设计(java版)
第10章 综合应用设计(java版)
 
第01章 绪论(java版)
第01章  绪论(java版)第01章  绪论(java版)
第01章 绪论(java版)
 
第05章 数组和广义表(java版)
第05章  数组和广义表(java版)第05章  数组和广义表(java版)
第05章 数组和广义表(java版)
 
第06章 树和二叉树(java版)
第06章  树和二叉树(java版)第06章  树和二叉树(java版)
第06章 树和二叉树(java版)
 
第02章 线性表(java版)
第02章  线性表(java版)第02章  线性表(java版)
第02章 线性表(java版)
 
第08章 查找(java版)
第08章  查找(java版)第08章  查找(java版)
第08章 查找(java版)
 
第03章 串(java版)
第03章  串(java版)第03章  串(java版)
第03章 串(java版)
 
机器学习V10baochang svm
机器学习V10baochang svm机器学习V10baochang svm
机器学习V10baochang svm
 
MongoDB for C# developer
MongoDB for C# developerMongoDB for C# developer
MongoDB for C# developer
 
浅析Flash特效开发 陈勇
浅析Flash特效开发 陈勇浅析Flash特效开发 陈勇
浅析Flash特效开发 陈勇
 
卷積神經網路(Python+TensorFlow+Keras)
卷積神經網路(Python+TensorFlow+Keras)卷積神經網路(Python+TensorFlow+Keras)
卷積神經網路(Python+TensorFlow+Keras)
 
ncuma_pylab.pptx
ncuma_pylab.pptxncuma_pylab.pptx
ncuma_pylab.pptx
 
数据结构回顾
数据结构回顾数据结构回顾
数据结构回顾
 
Ch3第三單元
Ch3第三單元Ch3第三單元
Ch3第三單元
 
Tutorial of cnn 赵子健9.16
Tutorial of cnn 赵子健9.16Tutorial of cnn 赵子健9.16
Tutorial of cnn 赵子健9.16
 

More from Yan Li

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials finalYan Li
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials finalYan Li
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials finalYan Li
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials finalYan Li
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials finalYan Li
 
Introduction to om
Introduction to omIntroduction to om
Introduction to omYan Li
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)Yan Li
 

More from Yan Li (7)

Chapter 01 essentials final
Chapter 01 essentials finalChapter 01 essentials final
Chapter 01 essentials final
 
Chapter 05 essentials final
Chapter 05 essentials finalChapter 05 essentials final
Chapter 05 essentials final
 
Chapter 04 essentials final
Chapter 04 essentials finalChapter 04 essentials final
Chapter 04 essentials final
 
Chapter 02 essentials final
Chapter 02 essentials finalChapter 02 essentials final
Chapter 02 essentials final
 
Chapter 03 essentials final
Chapter 03 essentials finalChapter 03 essentials final
Chapter 03 essentials final
 
Introduction to om
Introduction to omIntroduction to om
Introduction to om
 
第09章 排序(java版)
第09章  排序(java版)第09章  排序(java版)
第09章 排序(java版)
 

第07章 图(java版)

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