基本数据结构与运算-图
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
有重复的路径称为回路
1
2 4 3
图的遍历 深优
1. 深度优先遍历
(1)从一个未访问过的顶点开始,访问它的一个
未访问过的相邻顶点。
(2)如果顶点的所有相邻顶点都是已访问过的,
则需要回溯到之前的一个顶点wk.baidu.com选取它的另一个 未被访问的相邻顶点。
(3)对于前两个步骤是递归的
图的遍历 深优
typedef struct graph_m{ elemtype node[MAXNUM]; 顶点集合 int arcs[MAXNUM][MAXNUM]; 边的邻接矩阵 }graph_m;
二维数组
图的存储(课堂练习)
请写出下面这副图的邻接表
1)给顶点编号 2)建立顶点数组 3)建立各顶点的邻接链表 注意,此图为有向图
有向图 图 无向图
V1 V2 V3 V4 V1 V3
V2
V4
在有向图中,<V1,V3>表示从V1到V3的一条弧。
V1为弧尾或初始点,V3为弧头或终端点。
在无向图中,(V1,V3)表示V1和V3之间的一条边。
图的定义、术语
V1 V2 V3 V4
G=( V, E )
顶点集合V={V1 , V2 , V3 , V4 } 弧的集合G={<V1 ,V3>, <V3 ,V4>,
3.6 图
3.6.1 图的基本概念
3.6.2 图的存储
3.6.3 图的遍历
3.6.4 图的应用
图的定义、术语
3.6.1 图的基本概念
数据结构 B=(D,R)
图: G=(V,E)
A
1
3 2
B D
5
C
6
顶点:图中的数据元素
V:表示顶点的非空有限集合。
E:表示两个顶点之间关系的集合。
图的定义、术语
1
3 2
B D
5
C
6
图的存储 邻接矩阵
3.6.2
图的存储
1. 邻接矩阵法
(1)给顶点编号 (2)建立邻接(关系)矩阵
1 2 1 2 3 4
3
4
0 0 0 0 1 0 1 1 1 0 0 1
a i j表示弧< i,j > 1:表示有弧;0:表示无弧
2 1 4
0 1 1 0 任意顶点的出度是该行元素之和 任意顶点的入度是该列元素之和
1. 深度优先遍历
(1)从一个未访问过的顶点开始,访问它的一个
未访问过的相邻顶点。 (2)如果顶点的所有相邻顶点都是已访问过的, 则需要回溯到之前的一个顶点,选取它的另一个 未被访问的相邻顶点。 (3)对于前两个步骤是递归的
回到8 1 1 3 7 8 6 5 2 4
2
3
5 8 7 6
或者按以下顺序遍历:
邻顶点都被访问了,意味着图中所有顶点都被访
问了。
即栈空时
图的遍历 深优
用递归调用实现深度优先遍历算法
visit (v); visited[ v ] = 1; 1 访问顶点 v; p取得顶点的一个未被访问过的顶点 = g[v]->next_adj 2 w; while(p != NULL){ w = p->node_index; if(visited[w] == 0) 3 dfs(g, w);回到2; dfs(g,w); p 4重复 2= ,p->next_adj; 3直到该顶点所有的相邻顶点都被访问过; }
2
2 1
1 3 3
5 4
a[4][4] =
0 2 3 5
2 0 1 0
3 1 0 1
5 0 1 0
1
a[ i ][ j ]:记录边的权值;为0表示无边
图的遍历
3.6.3
图的遍历
问题:
1)对于连通图,从一个顶点出发沿着所有可能的
路径,是否可以将所有的顶点遍历到。
2)图中有回路,遍历算法可能产生死循环。
< V 2 , V 4 >, <V 4 , V 1 >}
V1 V3
顶点集合V={V1 , V2 , V3 , V4 } 边的集合E={(V1, V3), (V1, V2), (V1, V4),(V2, V4)} 顶点(V1, V3)与 (V3, V1)表示同一条边
V2
V4
图的定义、术语
权:与图的边或弧相关的数。 顶点的度:依附于该顶点的边数或弧数。 出度:(仅对有向图)以该顶点为尾的弧数。 入度:(仅对有向图)以该顶点为头的弧数。 路径:顶点A与顶点C之间存在一条路径。路径上边或弧的数目 称为该路径的路径长度。 连通图:无向图任意两顶点都有路径(没有孤立顶点) 强连通图:有向图任意两顶点都有路径 网:带权的图称为网 A
1 2 4 5
3
1 2 3 4 5
data
data
data data data
2 1 5 1 4
3 3
图的存储
图的邻接表存储法的特点
优点 节省存储空间 边的插入和删除操作比较简便 缺点 结构复杂 具有两种不同的基本组成单元
图的存储
3. 边带权值的图的存储
1)在邻接矩阵中的实现
3
图的存储 邻接矩阵
1 2 0 1 3 1 4 0
1
3 2
0 1 1 0 邻接矩阵的优点:
增减边的操作简单 邻接矩阵的缺点:
1 2 3 4
4
1 0 1 1 1 1 0 1
无向图的邻接矩阵是对称的
增减顶点的操作需要搬移大量的元素, 浪费存储空间
图的存储 邻接矩阵的实现
图的邻接矩阵实现
注意使用栈支持递归:
1 3 6 8 4 7 2 5
1 3 6 8 4 2 5 7
4
图的遍历 深优
深度优先遍历的特点
“深度”:总是访问顶点的一个相邻顶点,好像
是沿着图中的一条路径走到“底”,然后后退一
点,再选一条路。如此“进进退退”,直到所有 顶点都被访问
对于连通图,如果第一个被访问的顶点的所有相
void dfs (g,v){
}
void dfs(g ,1 v){ visited[ v 1 ] = 1; p = g[ 1 v ]->next_adj while(p != NULL){ w = p->node_index; 2 ]] == w == 0) 0) if(visited[ 5 dfs( g g,, 2 w ); 5 ); p = p->next_adj; } }} }
1
5
void dfs(g ,5){ visited[ 5 ] = 1; p = g[ 5 ]->next_adj while(p != NULL){ w = p->node_index; if(visited[ w ] == 0) dfs( g , w ); p = p->next_adj; }}