SJJG图

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//nextadj(G, v, w):返回图G中顶点v的邻接点中处于w之后的邻接 点,若不存在则返回0 25
算法
//基于dfs遍历整个图的完整算法 //分析:若图不连通,则调用dfs算法就不能保证遍历图 中所有的顶点;可以通过判断访问标记选择新的访问起 点 void dfs_travel(graph G) { int i; for(i=1; i<=n; i++) visited[i]=FALSE; for (i=1; i<=n; i++) if(visited[i]==FALSE) dfs(G, i); }
B
A
C D
E
21
图的遍历——深度优先搜索
1. 选中第一个被访问的结点 2. 对结点作已访问过的标记 3. 依次从结点的未被访问过的第一个、第二个、… 邻接结点出发,进行深度优先搜索,转向2 4. 如还有顶点未被访问,则选中一个起始结点, 转2 5. 所有的结点都被访问到,则结束
22
示例
• 对下图进行深度优先搜索
33
示例
• 图的邻接矩阵、邻接表、搜索序列
• DFS序列为:v3、v0、v1、v2、v4 • BFS序列为:v3、v0、v2、v4、v1
34
思考
• 已知图的邻接表,不用还原出原图,构造bfs(1) 生成树及其遍历序列
1 2
3 4 5 6 7 2 3 ^
1
3
4 ^
4
5 ^
4
2
3
5 6
8 ^
4 4 5 5 ^ 6 ^ 7 ^ 8 ^
6
示例
7
图的定义和基本 术语
• 关联是顶点与边的关系,一条边最多只能和两个 顶点相关联,一个顶点可以和多条边相关联 • 邻接是顶点与顶点或边与边的关系 • 顶点的度
– 与顶点(V)相关联的边的数目,记为TD(V) – 出度OD(V):在有向图中,把以顶点V为尾的弧的数 目称为顶点V的出度 – 入度ID(V):在有向图中,把以顶点V为头的弧的数 目称为顶点V的入度 – TD(V)=OD(V)+ID(V)
32
算法
//基于bfs遍历整个图的完整算法 //分析:与基于dfs遍历整个图的完整算法相似
void bfs_travel(graph G) { int i; for(i=1; i<=n; i++) visited[i]=FALSE; for (i=1; i<=n; i++) if(visited[i]==FALSE) bfs(G, i); }
26
算法
//应用图的遍历判定图的连通性问题 //分析:调用一次dfs算法可以遍历所在连通分量中所有 顶点;重新选择起点的次数就是图中连通分量的个数 void numofGC(graph G) { int i; int k=0; for(i=1; i<=n; i++) visited[i]=FALSE; for (i=1; i<=n; i++) if(visited[i]==FALSE) { k++; dfs(G, i); } }
28
示例
• 图的广度优先搜索 • 广度优先的访问次序:1、2、11、12、3、6、7、 10、4、5、8、9
1 ·1
2
3 4 6 5
12
7 8
11
10 9 3 · 4 ·
· 2
· 6 5 · 8 · · 7
11 · · 10 · 9
12 ·
29
示例
• 图的广度优先搜索遍历实现方法分析
A C G H I B E L F D J K A B C 1. 结点A进队 2. 结点A出队、访问,队空 3. 结点A的儿子结点进队 4. 结点B出队、访问 5. 结点B的儿子结点进队 6. 结点C出队、访问 7. 结点C的儿子结点进队 C D D C D D E E E F F F G G H G D
• 回路(环) 起始顶点和终结顶点相同的简单路 径
– 如上图所示: V1-V3- V4 - V1 、 V1- V2 -V3 -V4 - V1 均为环
V1 1
4
V4
V2 2
3 V3 图G
11
图的定义和基本 术语
• 连通图 无向图G中任意两个顶点Vi、Vj之间有路 径 • 连通分量 无向图的极大连通子图 • 强连通图 有向图G中任意两个顶点Vi、Vj之间都 有路径 • 强连通分量 有向图的极大连通子图
8
思考
• 顶点的度与图中边的数目的关系?
9
图的定义和基本 术语
• 路径 由G 中顶点Vi经过若干个顶点总可到达Vj, 则称由Vi经过的顶点序列到Vj为Vi到Vj的一条路 径 • 路径长度 路径上边的数目 • 若路径中的边互不相同,则称其为链
如上图:V1-V3-V4是V1到V4的
一条路径,路径长度为2;
3
图的边数
• 约定:不考虑顶点到其自身的边,也不允许一条 边在图中重复出现,并设图G的顶点数为n,则 有如下性质: • 完全图 任意一对顶点间均有边相连
– 无向图:最多有n(n-1)/2条边 – 有向图:最多有n(n-1)条边
– 无向完全图:有n(n-1)/2条边的无向图 – 有向完全图:有n(n-1)条边的有向图
27
图的遍历——广度优先搜索
1. 选中第一个被访问的结点V; 2. 对结点V作已访问过的标志; 3. 依次访问结点V的未被访问过的邻接结点W1、 W2、W3…… Wm,且进行标记; 4. 依次访问结点W1、W2、W3…… Wm未被访问过 的邻接结点,且进行标记; 5. 如果还有结点未被访问,则选中一个起始结点, 也标记为V,转向2; 6. 所有的结点都被访问到,则结束
37
图的生成树
• 概念:n个顶点的连通图的生成树是一个极小连 通子图,它包含图中所有顶点和n-1条边 • 特点:生成树中任意两个顶点间的路径是唯一的 • 注:
– 有n-1条边的图不一定是生成树 – 边数>n-1时,则形成环 – 边数<n-1时则不连通
38
深度优先生成树、广度优先生成树
• 由图遍历的过程中经过的边加上图的所有顶点所 构成的子图 • 一个图的生成树因其遍历方式不同不一定唯一
同理:V1- V2 -V3 -V4也是V1到 V4的一条路径,路径长度为3
V1 1 V2 2
4
V4
3 V3 图G
10
图的定义和基本 术语
• 简单路径 一条路径上的顶点除起始顶点和终结 顶点可相同外,其它顶点都不相同
– 例如:下图中的V1-V3-V4、 V1- V2 -V3 -V4、 V1- V4 均为简单路径
• 答案
B C D E A G F
有向图的邻接矩阵 A B C D E F G ∞ 1 ∞ ∞ 1 1 ∞ ∞ ∞ 1 ∞ 1 ∞ 1
∞ ∞ ∞ ∞ ∞ ∞∞ ∞ ∞ ∞ ∞ ∞ 1 1 ∞ ∞ ∞ ∞ ∞ 1 ∞
∞∞∞ ∞ ∞ ∞∞ 1
∞∞∞ ∞ ∞ ∞∞∞
• 深度优先遍历的结点序列: A B C E F G D • 广度优先遍历的结点序列: A B C D E F G
数据结构
——图
目录
• • • • • • 图的基本概念 图的存储结构 图的遍历算法及其应用 图的连通性问题及最小生成树 最短路径 拓扑排序
2
图的定义和基本 术语
• 图 G=(V, E),V(G)是顶点的非空有穷集合,E(G) 是边的有穷集合,边是相关顶点的偶对 • 无向图 指图中的边是顶点的无序对,即边没有 方向,记作(Vi, Vj) • 有向图 指图中的边是顶点的有序对,即边有方 向性,记作<Vi, Vj>,表示从顶点Vi到顶点Vj的弧, 其中Vi称作始点(尾顶点),Vj称作终点(头顶 点)
16
练习
• 画出下图的邻接矩阵
17
图的存储结构——邻接表
• 无向图的邻接表
– 有n个顶点的无向图的邻接表由n个线性链表组成 – 第i的链表中的结点由与该顶点相邻接的顶点组成 – n个线性链表的头指针按顺序存储
0 v1 1 0 0 0
V1
1
4
V4
2 2 ^
1 2 ^
3 ^
1 2
v2 v3
v4
V2
2
30
示例
• 图的广度优先搜索
31
算法
//bfs算法描述
void bfs(graph G,int v0) { int w; queue Q; init_queue(Q); visite(v0); visited[v0]=TRUE; En_queue(Q, v0); while(!empty(Q)) { v=del_queue(Q); w=firstadj(G,v); while(w!=0) { if(!visited[w]) {visite(w); visited[w]=TRUE; En_queue(Q, w);} w=nextadj(G,v); } } }
4
图的定义和基本 术语
• 网络(带权图) 在许多情况下,不仅要表示两个对 象(顶点)间是否有关系,而且还要表示出关系 的程度(如距离长短等)。在这种情况下就要给 每条边再附加一个数值作为权值,这样的带权图 就成为网络 网络 G • 圈 不论有向图还是无向图,若 A B 3 其中一边的两个顶点相同则称 其为圈 5 10 E 15 • 简单图 若图中不存在圈,也没 1 有两边连接同样两个顶点,则 C D 称这样的图为简单图
1 · 2 · 3 · 4 · 6 · 5 · 7 · 1 ·
6 ·
7 ·
2 ·
3 ·
4 ·
23
示例
• 图的深度优先搜索
24
算法
//dfs算法描述 void dfs(graph G,int v) { int w; visite(v); visited[v]=TRUE; w=firstadj(G,v); while(w!=0){ if(visited[w]==FALSE) dfs(G, w); w=nextadj(G, v, w); } } //firstadj(G,v):返回图G的第一个邻接点,若不存在则返回0
1 2 3 5 4 深度优先生成树 5 1
4
1
2 3
广度优先生成树
2
3
5
4
39
示例
40
最小生成树
• 对于网络,边是带权值的。生成树上各边权值之 和称为生成树的代价 • 各边权的总和最小的称为最小代价生成树,简称 最小生成树 • 一个连通图的最小生成树不一定唯一,但最小生 成树的代价一定是相同的(权值之和必相等)
8
8
7
35
练习
• 已知图G=(V,E)
– V={A,B,C,D,E,F,G} – E={<A,B>,<A,C>,<A,D>,<B,C>,<B,E>,<B,F>,<D,F>,<D,G>, <E,F>,<F,G>}
• 请画出图形,并画出其邻接矩阵 • 请分别写出深度优先和广度优先遍历的结点序列
36
练习
• 有向图的逆邻接表
– 有n个顶点的无向图的邻接表由n个线性链表组成 – 第i的链表中的结点由以Vi为弧首的顶点组成 – n个线性链表的头指针按顺序存储
0 v1 1 ^ 3 ^
V1 V2 2
1 3
4 V3
V4
1 v2 2 v3
3 v4
0
^
1
3 ^
20
练习
• 画出下图的邻接表(有向图同时画出逆邻接表)
3
3 ^
V3
3
18Biblioteka 图的存储结构——邻接表• 有向图的邻接表
– 有n个顶点的无向图的邻接表由n个线性链表组成 – 第i的链表中的结点由以Vi为弧尾的顶点组成 – n个线性链表的头指针按顺序存储
V4 0 v1 2 ^ 0 ^ 0 2 ^
V1 2
1 3
4
1 v2 2 v3
3 v4
V2
V3
2 ^
19
图的存储结构——邻接表
5
图的定义和基本 术语
• 子图 设G=(V, E)是一个图,若V’是V的子集,E’ 是E的子集,且E’中的边所关联的顶点均在V’中; 则:G’=(V’, E’)是G=(V, E)的子图 • 任何图G是其本身的子图 • 子图记作:G’ G • 真子图 若G’ G,且G’ G,则称G’是G的真子图, 即作G’ G • 支撑子图 若G’ G,且v(G’)=v(G),E(G’)E(G), 即两个图的顶点集合相同,而G’的边集是G的边 集的子集,称G’是G的支撑子图
– 约定:邻接结点的访问次序以序号为准,序号小的 先访问 – 1. 从结点 1 出发搜索,没有搜索到所有的结点,必 须另选图中未访问过的结点 继续进行搜索。从结点 5 1 出发搜索序列:1.2.3.4.5.6.7 · – 从结点 5 出发搜索序列:5.6.2.3.1.4.7
6 5 7 4 3 2 1
12
示例
13
图的存储结构——邻接矩阵
• n个顶点的图的邻接矩阵用n阶方阵表示
• 优势:便于判断两顶点是否相邻,并计算各自的 度 • 顶点Vi的度的计算
– 无向图:度为第i行元素之和 – 有向图:
• 入度=第i列非零元素个数 • 出度=第i行非零元素个数
14
示例
• 图的邻接矩阵
15
示例
• 带权图的邻接矩阵
相关文档
最新文档