济南大学数据结构(Java版)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7.1 图的基本知识 7.1.1 图的定义
图 G 是由两个集合顶点集 V(G) 和边集 E(G) 组成的,记作 G=( V(G),E(G) ),简称G=(V,E)。 V是顶点的有穷非空集合 E是两个顶点之间的关系,即边的有穷集合
A A C C
B B
D D
E E
无向图和有向图 1. 无向图: 边是顶点的无序对,即边没有方向性。 v1 v3 v2
在有向图 G 中,如果对于每一对 vi, vj ∈V,vi≠vj ,从 vi 到 vj 和 从
vj 到 vi 都存在路径,则称 G 是强连通图。
v1
v2
是否为强连通图
v3
v4
有向图中的强连通的最大子图称作有向图的强连通分量。
v1
注意
v2
非强连通图
v3
v4
强连通分量 强连通图的 强连通分量是其自身 而非强连通图 可以有多个
0 0 0
3 1
0 0 0
4 0
0 1 0
v3
v4
有向图,顶点 vi 的出度是邻接矩阵中第 i 行的元素之和。
顶点 vi 的入度是邻接矩阵中第 i 列的元素之和。 例 v1 的度为 2+1=3。
v1
v3 v4 v1
v2
v5
无向图
1 2 3 4 5
1 0 1 0 1 0 1 0 0 0 1
2 1 0 1 0 1 2 1 0 0 0
称 v1 为弧尾,称 v2 为弧头。
< v1 , v2 > ≠ < v2 , v1 >
3. 完全图、有向完全图 有 2 n(n-1) 条边的无向图称为完全图。 有 n(n-1) 条弧的有向图称为有向完全图。
1
v1
v2
v1
v2
v3
v4
v3
4. 带权无向图(无向网) 和 带权有向图(有向网) 有时对图的边或弧赋予相关的数值,这种与图的边或弧相 关的数值叫做权。 A 5 B
v4
V = { v1 , v2 , v3 , v4 , v5 }
v5
E = { ( v1 , v2 ) , ( v1 , v4 ) , ( v2 , v3 ) , ( v2 , v5 ) , ( v3 , v4 ) , ( v3 , v5 ) }
( v1 , v2 )表示顶点 v1 和 v2 之间的边
2. 容易求取各个顶点的度。
邻接矩阵的特点
1)判断ViVj间是否有边(弧),只需检查A[i][j]的值是否非0。
2)很容易计算顶点的度。
无向图的度:顶点Vi 的度为第i行(或第j列)的非零元素个数。 有向图:
第i行的元素之和是顶点Vi 的出度;
:0行的j元素:[0, j]=1 第j列的元素之和是顶点Vj 的入度。 例 表示:<V ,V >弧存在
距 离 耗 费
9 4 C 8 1 2 D E 7
这种带权的图通常称为网。
3
带权的无向图称为无向网。
带权的有向图称为有向网。
5. 邻接与关联 v v’
对于无向图 G=(V, E),如果边 (v, v’) ∈ E,则称顶点 v 和 v’ 互为
邻接点,即 v 和 v’ 相邻接。
边 (v, v’) 依附于顶点 v 和 v’ ,或者说 (v, v’) 与顶点 v 和 v’ 相关联。
V1
V2 V5
对非连通图,则称由各个连通分量的生成树的集合为 此非连通图的生成森林。
性质: 一个有n个顶点的连通图的生成树有且仅有n-1条边。 1. 如果一棵生成树有 n 个顶点和小于 n-1 条边,则为非连通图。 构成一棵 n 顶点生成树需要 n-1 条边,
少于 n-1 ,则必有边断开,不再连通。
7.2.2 邻接表
对图中每一个顶点建立一个单链表,指示与该顶点邻接的顶点和关 联的边或弧。
v1
e2 e5
e1
e3
v2
e6 e4
0 1
v1 v2 v3 v4
v4 v5 v5 v3 v3
v2 ∧ v3 v4 v1 ∧ v2 ∧ 边结点 v1 ∧ v2 ∧
v3
2
3 4
v4
v5
顶点结点
v5
data
next
0 j
V0 V2 V3
V1
V4
0 1 0 1 0
1 0 1 0 1
0 1 0 1 1
1 0 1 0 0
0 1 1 0 0
V0
V1
V2
V3
0 0 0 1
1 0 0 0
1 0 0 0
0 0wenku.baidu.com1 0
例:2列的i元素:[i , 2]=1 表示:<Vi ,V2>弧存在
例无向图 G
v1 v3 v4
v2
v5
1 2 A(G) = 3 4 5
v1 v3 v4
v2
是否为连通图
v5
连通分量指的是无向图中的极大连通子图。
极大连通子图:将图中,任何不在连通子图中的顶点,加到子图中后,子图 就不再是连通的。
A
B
C
F L A
D
G
E
H H
非连通图 连通图的 连通分量是其自身 而非连通图 可以有多个
B
连通分量为
C
G
D H E
F
H
L
4. 强连通图
有向图G,如果从顶点 v 到顶点 v’ 有路径 或 从顶点 v’ 到顶点 v 有 路径,则称 v 和 v’ 是连通的。
4 1 0 1 0 0
5 0 1 1 0 0
邻接矩阵存储的图类
public class Graph1 { protected int n; protected int mat[][];} //以邻接矩阵存储的图类 //图的结点个数 //二维数组存储图的邻接矩阵
优点:
1. 容易判断任意两个顶点之间是否有边或弧。
《数据结构(Java版)》
第1章 绪论 第2章 线性表 第 3章 串 第4章 栈与队列 第5章 数组和广义表 第6章 树和二叉树 第 7章 图 第8章 查找 第9章 排序
第七章
A
C D
图
B
E
图是一种较线性表和树更为复杂的数据结构。 线性表: 线性结构(前驱、后继) 树: 层次结构(父子) 图: 任意两个数据元素之间都可能相关(邻接)
v1
v2
顶点 v1 的出度为 2
顶点 v1 的入度为 1
v3 v4 顶点 v1 的度为 3
2. 度与边的关系
性质: 对于一个图(无向图、有向图),如果结点 vi 的度为TD(vi),
那么具有 n 个顶点、e 条边或弧的图,必满足如下关系
e= 2
v1 v2
1
i=1
∑
n
TD(vi)
v1 v2
v3
v4 v5 v3 v4
B
H
L
H
7.2 图的存储结构
顺序存储 邻接矩阵 链式存储 邻接表
如何表达顶点之间 存在的关系?
7.2.1 邻接矩阵
设图 G = ( V ,E ) 具有 n(n≥1) 个顶点 v1 , v2 , … , vn 和 m 条边或弧 e1 , e2 , ,… em ,则 G 的邻接矩阵是 n×n 阶矩阵,记为 A(G) 。 邻接矩阵存放 n 个顶点信息和 n2 条边或弧信息。 其每一个元素 aij 定义为: 0 顶点 vi 与 vj 不相邻接
1 2 A= 3 4 5 6
1 2 3 4 5 6 0 5 ∞ 7 ∞ ∞ ∞0 4 ∞ ∞ ∞ 8 ∞0 ∞ ∞ 9 ∞∞ 5 0 ∞ 6 ∞∞∞ 5 0 ∞ 3 ∞∞∞ 1 0
wij 若vi≠ vj,顶点 vi 与 vj 相邻接 aij =
∞ 0 若vi≠ vj,顶点 vi 与 vj 不相邻接 若vi= vj
v
点 v’,顶点 v’ 邻接自顶点 v 。 弧 <v, v’> 和顶点 v, v’ 相关联。
v’
对于有向图 G=(V, E) ,如果弧 <v, v’> ∈ E,则称顶点 v 邻接到顶
7.1.2 结点的度 1. 度、入度、出度
对于无向图,结点 v 的度是和 v 相关联的边的数目,记做TD(v)。
v1
v2
v3
v4 v5
顶点 v3 的度为 3
对于有向图,顶点 v 的度 TD(V) 分为两部分——出度、入度。 以结点 v 为终点的弧的数目称为 v 的入度,记为ID(v) ; 以结点 v 为起点的弧的数目称为 v 的出度,记为OD(v); 顶点 v 的度为 TD(v) = ID(v) + OD(v)。
aij =
例,有向图 G
1
顶点 vi 与 vj 相邻接
1 A(G) = 2 3 4 1 0 0 0 1 2 1 0 0 0 3 1 0 0 0 4 0 0 1 0
v1
v2
v3
v4
例无向图 G
v1 v3 v4
v2
v5
1 2 A(G) = 3 4 5
1 0 1 0 1 0
2 1 0 1 0 1
3 0 1 0 1 1
( v 1 , v2 ) = ( v 2 , v 1 )
2. 有向图: 其边是顶点的有序对,即边有方向性。
v1 v2
v3
V = { v1 , v2 , v3 , v4 }
v4
E = { < v 1 , v2 > , < v 1 , v 3 > , < v 3 , v 4 > , < v 4 , v 1 > } 通常有向图的边称为弧,< v1 , v2 >表示顶点 v1 到 v2 的弧。
data
next
data : 顶点的信息 next : 第一条关联边结点
data : 结点数据元素信息
next : 与该结点关联的另一条边
声明邻接表存储的图类
import ds_java.OnelinkNode; public class Graph2 {
//单向链表的结点类 //以邻接表存储的图类
3 0 1 0 1 1
4 1 0 1 0 0 3 1 0 0 0
5 0 1 1 0 0 4 0 0 1 0
v2
1 2 3
v3
v4
有向图
4
无向图的邻接矩阵都是对称矩阵。 有向图的邻接矩阵一般不对称。
无向图可以采用 压缩存储方式
带权图(网) 的邻接矩阵 v1
3 5 7
v2
8 9
4
v6
1
v3
5
6
v5
5
v4
private OnelinkNode table[]; //图的邻接表
无向图、有向图的边或弧均计算两遍。
当G为有向图时,上式可写为:
i=1 n
∑
n
ID(vi)= ∑ OD(vi)=e
i=1 n
n
i=1
∑ TD(vi)=∑
i=1
ID(vi)+∑ OD(vi)=2e
i=1
n
7.1.3 子图 假设有两个图 G=(V, E) 和 G’=(V’, E’) ,如果 V’ V, 且 E’ E,并且E’中的边所关联的结点都在V’中,则称 G’ 为 G 的子图。 v2 v1
路径的路径长度。 v1
5 v2 2 8 6
v4
3 v3
9 v5 7
从结点v1到v5的一条路径(v1,v4,v5)的路径长度是2+9=11。 一个有向图G中,若存在一个结点v0,从v0有路径可以到达图G 中其他所有结点,则称此有向图为有根的图,称v0为图G的根。
3. 连通图
无向图G,如果从顶点 v 到顶点 v’ 有路径,则称 v 和 v’ 是连通的。 如果对于无向图 G 中任意两个顶点 vi , vj ∈V, vi 和 vj 都是连通的, 则称 G 是连通图。
2. 如果一棵生成树有 n 个顶点和多于 n-1 条边,则一定有环。 构成一棵 n 顶点生成树需要 n-1 条边,
若再添加一条边,必会使得与它关联的那两个顶点之间有了
第二条路径。
A C J
B
L
H
性质: 一个连通图的生成树并不唯一
A
C
B
生成树
A
C
B
J
L H L
J
H
A
C J L
删除环中的任一条边
B
A
C J
1 0 1 0 1 0
2 1 0 1 0 1
3 0 1 0 1 1
4 1 0 1 0 0
5 0 1 1 0 0
无向图,顶点 vi 的度是邻接矩阵中第 i 行或第 i 列的元素之和。
例 G1中,v1 的度为 2 ,v2 的度为 3 。
例有向图 G
v1
v2
A(G) =
1 2 3 4
1 0
0 0 1
2 1
v0
v1
v2
...
vk-1
vk
顶点 v0 和 vk 分别称为路径 w 的起点和终点。 路径的长度是路径上的边的数目。 w 的长度为 k 如果在一条路径中,除起点和终点外,其他结点都不相同,则此路 径称为简单路径。 起点和终点相同且长度大于1的简单路径称为回路。
2. 有根的图和图的根
带权图中,从起点到终点的路径上各条边的权值之和称为这条
v1
v2 v3
v4
7.1.5 生成树 一个连通图的生成树是一个极小连通子图。 极小连通图:在极小连通子图上,删除任一条边子图就不 再连通,若再增加一条边,必定构成一个环。 生成树的三要素: ①所有n个顶点;②有n-1条边;③图是连通的。
V1 V3 V4 V5 V2 图的 生成树 V4 V1 V3 V5 V2 V4 V3
求子图
v1 v1
v3
v4
v3 v1
v2
v1
v1
v2
v3
v4
v3
v4
v3
v4
v1
v3 v4
v2
子图有
v2 v1 v3 v5 v2
v5
v1
v1 v3
v2
v4
v5
v4
v5
7.1.4 路径、回路及连通性 1. 路径、路径长度、回路
无向图 G 中若存在一条有穷非空序列 w = v0 e1 v1 e2 v2 … ek vk ,其 中 vi 和 ei 分别为顶点和边,则称 w 是从顶点 v0 到 vk 的一条路径。 e1 e2 ek