第07章 图,C++教程,辽宁工程技术大学,理学院
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法 Data Structures and Algorithms
7.2 图的存储结构
邻接矩阵
邻接表 边集数组
数据结构与算法 Data Structures and Algorithms
1. 邻接矩阵(adjacency matrix)表示法
利用矩阵表示图形中顶点之间相邻关系
k=0:无权图 k≠0:有权图
for(i=0;i<MaxVertexNum;i++)
for(j=0;j<MaxVertexNum;j++)
if(i= =j) GA[i][j]=0; else if(k) GA[i][j]=MaxValue; else GA[i][j]==0; }
数据结构与算法 Data Structures and Algorithms
0
1
2
0
3
4 (a)
5
3
(b
数据结构与算法 Data Structures and Algorithms
8. 权和网 在一个图中,每条边可以标上具有某种含义的数 值,通常为正数,此数值称为该边的权(weight)。边 上带有权的图称作带权图,简称网(network)。
0 7 2 5 12 6 1 3 3 15 20 8 4
点连通起来,而非连通图有多个连通分量。
数据结构与算法 Data Structures and Algorithms
CA
C A
E
C
E
E
A
B (b)
D B (c) (a) (b)
D
FD
(d) (c)
F B
(c)
(d)
数据结构与算法 Data Structures and Algorithms
7. 强连通图和强连通分量 在有向图G中,若从顶点vi到顶点vj有路径,则称
邻接矩阵
数据结构与算法 Data Structures and Algorithms
(4,2)
0 (2,4) 1 1 A1 1 1 0
1 0 0 0 1 0
1 0 0 0 1 1
1 0 0 0 0 1
1 1 1 0 0 1
0 0 1 1 1 0
typedef int adjmatrix[MaxVertemNum][MaxVertemNum];
邻接矩阵
数据结构与算法 Data Structures and Algorithms
1. 图的邻接矩阵存储的初始化算法
void InitMatrix(adjmatrix GA,int k) { int i,j;
有向图
0 A 3 2 C 3 D (b) G2 4 E 1 B
5
V(G)={A,B,C,D,E}
E(G)={<A,B>,<A,C>,<B,C>,<B,E>,<C,B>,<C,D>,<E,D>}
数据结构与算法 Data Structures and Algorithms
7.1.2 图的基本术语
1. 端点和邻接点
7.1 图的概念
7.1.1 图的定义
图是一种复杂的非线性数据结构 G=(V,E)
顶点集 边集
数据结构与算法 Data Structures and Algorithms
有向图(directed graph):边集E(G)中为有向边 无向图(undirected graph):边集E(G)中为无向边
a 2 TJ 4 c e (b) G4
b
d
f
5. 路径和回路 路径(path):从顶点v到顶点v'的一个顶点序列。序列 中的第一个顶点为v,最后一个顶点为v'。 路径长度是指该路径上经过的边的数目。
简单路径:一条路径上的所有顶点均不同。
回路或环(cycle):一条路径上的前后两端点相同。 简单回路或简单环:除前后两端点相同外,其余顶点 均不同的回路。
有权图默认∞
2. 根据一个图的边集生成图的邻接矩阵的算法
k1 = 0:无向图 k1 ≠ 0:有向图
k2 = 0:无权图 k2 ≠ 0:有权图
数据结构与算法 Data Structures and Algorithms
void CreateMatrix(adjmatrix GA,int n,char* s,int k1,int k2)
端点
0 1 2 3 2 C
互为邻接点 0
A
端点
4 (a) G1
数据结构与算法 Data Structures and Algorithms
5
3 D (b) G2
A的出边 B的入边 起点
0 A 3B的入边 1 B
终点
邻接点
3 D
2 C 4 E (b) G2
A的出边 邻接点
5
G1
数据结构与算法 Data Structures and Algorithms
数据结构与算法 Data Structures and Algorithms
无向图
0 1 2 4 5 (a) G1 3 D 3 2 0 A
V(G)={0,1,2,3,4,5}
(
E(G)={(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(2,5),(3,5),(4,5)}
数据结构与算法 Data Structures and Algorithms
数据结构与算法 Data Structures and Algorithms
6. 连通和连通分量 在无向图G中,若从顶点vi到顶点vj有路径,则
称vi和vj是连通的。
若图G中任意两个顶点都连通,则称G为连通 图,否则称为非连通图。 无向图G的极大连通子图称为G的连通分量。 任何连通图都可以通过一个连通分量把所有顶
(4,1)
(b) G6
数据结构与算法 Data Structures and Algorithms
1 b
2 8
0 a 3
6 2 c 6 1 4
12 3 d
4 (b) G6
e
0 2 3 8 0 12 A2 6 0 6 1 0 4 0
邻接矩阵的大小怎么确定?
由图中顶点数确定
无向图的邻接矩阵为对称矩阵
数据结构与算法 Data Structures and Algorithms
(1,4)
0 0 A2 0 0 0
1 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0
数据结构与算法 Data Structures and Algorithms
图的邻接矩阵表百度文库应如何实现?
adjmatrix[ ][ ]
一个二维数组
存储顶点之间相邻的关系
一个一维数组
vexlist[ ]
存储图中n个顶点元素的信息
数据结构与算法 Data Structures and Algorithms
e
(b) G6 E(G)={<0,1>2,<0,2>3,<0,3>8,<1,3>12,<2,0>6,<2,3>6,
<2,4>1,<3,4>4}
数据结构与算法 Data Structures and Algorithms
7.1.3 图的抽象数据类型 数据部分: 为一个图G,采用顺序、链接等任一种存储结构, 假定存储类型用GraphType标识符表示, 操作部分: 包括初始化图、建立图、遍历图、查找图、输出 图、清除图等常用运算,以及求图的最小生成树、最 短路径、拓扑排序、关键路径等特定运算。
字符串输入流
int i,j;
WeightType w;
sin>>c1;
数据结构与算法 Data Structures and Algorithms
数据结构与算法 Data Structures and Algorithms
DAT GRAPH is Data: 一个图G,存储类型用标识符GraphType表示 Operations: void InitGraph(GraphType& G); void CreateGraph(GraphType& G, char* E, int n); void TraverseGraph(GraphType& G, int i, int n); bool FindGraph(GraphType& G, VertexType& item, int n); void PrintGraph(GraphType& G, int n); void ClearGraph(GraphType& GT); void MinSpanGraph(GraphType& G, int n); void MinPathGraph(GraphType& G, int n); void TopolGraph(GraphType& G, int n); void KeyPathGraph(GraphType& G, int n); end GeneralTree
a[ ]="((0,1),(0,2),(0,3),(1,4),(1,5),(1,6),(2,6),(4,5))";
如何读取字符串中每条边?
利用字符串输入流每次读取5个字符
数据结构与算法 Data Structures and Algorithms
#include<sstream>
字符串流头文件
istringstream sin(s); char c1,c2,c3;
1 b
12 E(G)={(0,1)5,(0,2)7,(1,2)12,(1,3)3,(1,4)8,(2,3)6,(2,4)20, 3 d (a) G5
(3,4)15}
数据结构与算法 Data Structures and Algorithms
1 b
2 8
0 a 3
6 2 c 6 1 4
12 3 d
4
图的结点数
const int MaxVertexNum; const int MaxEdgeNum; typedef int WeightType;
权重类型 定义∞
const WeightType MaxValue = ?;
顶点信息
typedef VertexType vexlist[MaxVertemNum];
2. 顶点的度(degree)
(1)无向图
0 1 2 3
0 A
2 C
D(V 0 )=43
4 (a) G1 5
D
(b) G
顶点的度:以该顶点为一个端点的边的数目,记为D(v)。
数据结构与算法 Data Structures and Algorithms
(2)有向图
3
0 A
1 B
2 C 3 D 4 E
行标为起点
列标为终点
(2,1)
数据结构与算法 Data Structures and Algorithms
(1,4)
0 7 2
5 12 6
1 3 3 (a) G5 15
8 4 20
0 5 7 0 a 6 5 0 122 3 8 3 1 A1 7 12 0 6 20 b 8 3 6 0 15 6 8 1220 15 0 4 3 d e
从vi到vj是连通的。若图G中的任意两个顶点vi和vj都
连通,即从vi到vj和从vj到vi都存在路径,则称G是强
连通图。有向图G的极大强连通子图称为G的强连通
分量。
强连通图可以通过一个强连通分量把所有结点
连通起来,非强连通图有多个强连通分量。
数据结构与算法 Data Structures and Algorithms
4. 子图 设有两个图G=(V,E)和G'(V',E'),若V'是V的子集,
即V'V,且E'是E的子集,即E'E,并且E'中涉及到
的顶点全部包含在V'中,则称G'是G的子图。
0 BJ 1 SH 3 XA (a) G3 CD
数据结构与算法 Data Structures and Algorithms
D(VB)=2+2=4
5
G1
(b) G2 入度:该顶点的入边的数目,记为 ID(v);
出度:该顶点的出边的数目,记为OD(v);
D(v)=ID(v)+OD(v)
数据结构与算法 Data Structures and Algorithms
3. 完全图、稠密图、稀疏图 若无向图中的每两个顶点之间都存在着一条边, 有向图中的每两个顶点之间都存在着方向相反的两 条边,则称此图为完全图。
1 无向的完全图中包含有: n (n- 1) 条边; 2
有向的完全图中包含有:n(n-1)条边。 稠密图 稀疏图
数据结构与算法 Data Structures and Algorithms
0 BJ 1 SH 3 XA (a) G3 CD TJ 4 2 c
a
b
d
e (b) G4
f
数据结构与算法 Data Structures and Algorithms
7.2 图的存储结构
邻接矩阵
邻接表 边集数组
数据结构与算法 Data Structures and Algorithms
1. 邻接矩阵(adjacency matrix)表示法
利用矩阵表示图形中顶点之间相邻关系
k=0:无权图 k≠0:有权图
for(i=0;i<MaxVertexNum;i++)
for(j=0;j<MaxVertexNum;j++)
if(i= =j) GA[i][j]=0; else if(k) GA[i][j]=MaxValue; else GA[i][j]==0; }
数据结构与算法 Data Structures and Algorithms
0
1
2
0
3
4 (a)
5
3
(b
数据结构与算法 Data Structures and Algorithms
8. 权和网 在一个图中,每条边可以标上具有某种含义的数 值,通常为正数,此数值称为该边的权(weight)。边 上带有权的图称作带权图,简称网(network)。
0 7 2 5 12 6 1 3 3 15 20 8 4
点连通起来,而非连通图有多个连通分量。
数据结构与算法 Data Structures and Algorithms
CA
C A
E
C
E
E
A
B (b)
D B (c) (a) (b)
D
FD
(d) (c)
F B
(c)
(d)
数据结构与算法 Data Structures and Algorithms
7. 强连通图和强连通分量 在有向图G中,若从顶点vi到顶点vj有路径,则称
邻接矩阵
数据结构与算法 Data Structures and Algorithms
(4,2)
0 (2,4) 1 1 A1 1 1 0
1 0 0 0 1 0
1 0 0 0 1 1
1 0 0 0 0 1
1 1 1 0 0 1
0 0 1 1 1 0
typedef int adjmatrix[MaxVertemNum][MaxVertemNum];
邻接矩阵
数据结构与算法 Data Structures and Algorithms
1. 图的邻接矩阵存储的初始化算法
void InitMatrix(adjmatrix GA,int k) { int i,j;
有向图
0 A 3 2 C 3 D (b) G2 4 E 1 B
5
V(G)={A,B,C,D,E}
E(G)={<A,B>,<A,C>,<B,C>,<B,E>,<C,B>,<C,D>,<E,D>}
数据结构与算法 Data Structures and Algorithms
7.1.2 图的基本术语
1. 端点和邻接点
7.1 图的概念
7.1.1 图的定义
图是一种复杂的非线性数据结构 G=(V,E)
顶点集 边集
数据结构与算法 Data Structures and Algorithms
有向图(directed graph):边集E(G)中为有向边 无向图(undirected graph):边集E(G)中为无向边
a 2 TJ 4 c e (b) G4
b
d
f
5. 路径和回路 路径(path):从顶点v到顶点v'的一个顶点序列。序列 中的第一个顶点为v,最后一个顶点为v'。 路径长度是指该路径上经过的边的数目。
简单路径:一条路径上的所有顶点均不同。
回路或环(cycle):一条路径上的前后两端点相同。 简单回路或简单环:除前后两端点相同外,其余顶点 均不同的回路。
有权图默认∞
2. 根据一个图的边集生成图的邻接矩阵的算法
k1 = 0:无向图 k1 ≠ 0:有向图
k2 = 0:无权图 k2 ≠ 0:有权图
数据结构与算法 Data Structures and Algorithms
void CreateMatrix(adjmatrix GA,int n,char* s,int k1,int k2)
端点
0 1 2 3 2 C
互为邻接点 0
A
端点
4 (a) G1
数据结构与算法 Data Structures and Algorithms
5
3 D (b) G2
A的出边 B的入边 起点
0 A 3B的入边 1 B
终点
邻接点
3 D
2 C 4 E (b) G2
A的出边 邻接点
5
G1
数据结构与算法 Data Structures and Algorithms
数据结构与算法 Data Structures and Algorithms
无向图
0 1 2 4 5 (a) G1 3 D 3 2 0 A
V(G)={0,1,2,3,4,5}
(
E(G)={(0,1),(0,2),(0,3),(0,4),(1,4),(2,4),(2,5),(3,5),(4,5)}
数据结构与算法 Data Structures and Algorithms
数据结构与算法 Data Structures and Algorithms
6. 连通和连通分量 在无向图G中,若从顶点vi到顶点vj有路径,则
称vi和vj是连通的。
若图G中任意两个顶点都连通,则称G为连通 图,否则称为非连通图。 无向图G的极大连通子图称为G的连通分量。 任何连通图都可以通过一个连通分量把所有顶
(4,1)
(b) G6
数据结构与算法 Data Structures and Algorithms
1 b
2 8
0 a 3
6 2 c 6 1 4
12 3 d
4 (b) G6
e
0 2 3 8 0 12 A2 6 0 6 1 0 4 0
邻接矩阵的大小怎么确定?
由图中顶点数确定
无向图的邻接矩阵为对称矩阵
数据结构与算法 Data Structures and Algorithms
(1,4)
0 0 A2 0 0 0
1 1 0 0 0 1 0 1 1 0 1 0 0 0 0 0 0 0 1 0
数据结构与算法 Data Structures and Algorithms
图的邻接矩阵表百度文库应如何实现?
adjmatrix[ ][ ]
一个二维数组
存储顶点之间相邻的关系
一个一维数组
vexlist[ ]
存储图中n个顶点元素的信息
数据结构与算法 Data Structures and Algorithms
e
(b) G6 E(G)={<0,1>2,<0,2>3,<0,3>8,<1,3>12,<2,0>6,<2,3>6,
<2,4>1,<3,4>4}
数据结构与算法 Data Structures and Algorithms
7.1.3 图的抽象数据类型 数据部分: 为一个图G,采用顺序、链接等任一种存储结构, 假定存储类型用GraphType标识符表示, 操作部分: 包括初始化图、建立图、遍历图、查找图、输出 图、清除图等常用运算,以及求图的最小生成树、最 短路径、拓扑排序、关键路径等特定运算。
字符串输入流
int i,j;
WeightType w;
sin>>c1;
数据结构与算法 Data Structures and Algorithms
数据结构与算法 Data Structures and Algorithms
DAT GRAPH is Data: 一个图G,存储类型用标识符GraphType表示 Operations: void InitGraph(GraphType& G); void CreateGraph(GraphType& G, char* E, int n); void TraverseGraph(GraphType& G, int i, int n); bool FindGraph(GraphType& G, VertexType& item, int n); void PrintGraph(GraphType& G, int n); void ClearGraph(GraphType& GT); void MinSpanGraph(GraphType& G, int n); void MinPathGraph(GraphType& G, int n); void TopolGraph(GraphType& G, int n); void KeyPathGraph(GraphType& G, int n); end GeneralTree
a[ ]="((0,1),(0,2),(0,3),(1,4),(1,5),(1,6),(2,6),(4,5))";
如何读取字符串中每条边?
利用字符串输入流每次读取5个字符
数据结构与算法 Data Structures and Algorithms
#include<sstream>
字符串流头文件
istringstream sin(s); char c1,c2,c3;
1 b
12 E(G)={(0,1)5,(0,2)7,(1,2)12,(1,3)3,(1,4)8,(2,3)6,(2,4)20, 3 d (a) G5
(3,4)15}
数据结构与算法 Data Structures and Algorithms
1 b
2 8
0 a 3
6 2 c 6 1 4
12 3 d
4
图的结点数
const int MaxVertexNum; const int MaxEdgeNum; typedef int WeightType;
权重类型 定义∞
const WeightType MaxValue = ?;
顶点信息
typedef VertexType vexlist[MaxVertemNum];
2. 顶点的度(degree)
(1)无向图
0 1 2 3
0 A
2 C
D(V 0 )=43
4 (a) G1 5
D
(b) G
顶点的度:以该顶点为一个端点的边的数目,记为D(v)。
数据结构与算法 Data Structures and Algorithms
(2)有向图
3
0 A
1 B
2 C 3 D 4 E
行标为起点
列标为终点
(2,1)
数据结构与算法 Data Structures and Algorithms
(1,4)
0 7 2
5 12 6
1 3 3 (a) G5 15
8 4 20
0 5 7 0 a 6 5 0 122 3 8 3 1 A1 7 12 0 6 20 b 8 3 6 0 15 6 8 1220 15 0 4 3 d e
从vi到vj是连通的。若图G中的任意两个顶点vi和vj都
连通,即从vi到vj和从vj到vi都存在路径,则称G是强
连通图。有向图G的极大强连通子图称为G的强连通
分量。
强连通图可以通过一个强连通分量把所有结点
连通起来,非强连通图有多个强连通分量。
数据结构与算法 Data Structures and Algorithms
4. 子图 设有两个图G=(V,E)和G'(V',E'),若V'是V的子集,
即V'V,且E'是E的子集,即E'E,并且E'中涉及到
的顶点全部包含在V'中,则称G'是G的子图。
0 BJ 1 SH 3 XA (a) G3 CD
数据结构与算法 Data Structures and Algorithms
D(VB)=2+2=4
5
G1
(b) G2 入度:该顶点的入边的数目,记为 ID(v);
出度:该顶点的出边的数目,记为OD(v);
D(v)=ID(v)+OD(v)
数据结构与算法 Data Structures and Algorithms
3. 完全图、稠密图、稀疏图 若无向图中的每两个顶点之间都存在着一条边, 有向图中的每两个顶点之间都存在着方向相反的两 条边,则称此图为完全图。
1 无向的完全图中包含有: n (n- 1) 条边; 2
有向的完全图中包含有:n(n-1)条边。 稠密图 稀疏图
数据结构与算法 Data Structures and Algorithms
0 BJ 1 SH 3 XA (a) G3 CD TJ 4 2 c
a
b
d
e (b) G4
f
数据结构与算法 Data Structures and Algorithms