数据结构第7章图
第七章图状结构
图的应用非常广泛。
2
7.1 图的类型定义
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树 7.5 两点之间的最短路径问题 7.6 拓扑排序
7.7 关键路径
3
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构 成的数据结构。 Graph = (V , R ) 其中,R={<v,w>| v,w∈V 且 P(v,w)} <v,w>表示从 v 到 w 的一条弧,并称 v 为弧尾,w 为弧头。
4
由于“弧”是有方向的,因此称由顶 点集和弧集构成的图为有向图。
例如: G1 = (V1, VR1)
A
B C D E
其中 V1={A, B, C, D, E} VR1={<A,B>, <A,E>,
<B,C>, <C,D>, <D,B>, <D,A>, <E,C> }
5
若<v, w>VR 且<w, v>VR, 则称 (v,w) 为顶点v 和顶点 w 之间存在一条边。 例如: G2=(V2,VR2) V2={A, B, C, D, E, F} VR2={(A,B), (A,E),
0 0 0 1 0 1
0 0 1 0 0 1
1 1 0 0 0 0
0 1 1 1 0 0
24
无向图邻接矩阵表示法特点:
1)无向图邻接矩阵是对称矩阵 2)顶点v的度 3)判断两顶点v、u是否为邻接点 4)顶点不变,在图中增加、删除边 5)适用于边稠密的图;
25
有向图的邻接矩阵 为非对称矩阵
0 0 0 1 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 0 0
第7章 图-有向无环图
算法的执行步骤: 算法的执行步骤: 1、用一个数组记录每个结点的入度。将入度为零的 、用一个数组记录每个结点的入度。 结点进栈。 结点进栈。 2、将栈中入度为零的结点V输出。 、将栈中入度为零的结点 输出 输出。 3、根据邻接表找到结点 的所有的邻接结点, 并将 、根据邻接表找到结点V的所有的邻接结点 的所有的邻接结点, 这些邻接结点的入度减一。 这些邻接结点的入度减一 。 如果某一结点的入度变 为零,则进栈。 为零,则进栈。
3
2
3、找到全为零的第 k 列,输出 k 、 4、将第 k 行的全部元素置为零 、 行的全部元素置为零
…………………
7
53、4;直至所有元素输出完毕。 、 ;直至所有元素输出完毕。
1 2 3 4 5 6 7
0 1 1 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0
template<class T> int BinaryTree <T>:: NumOfOne ( node <T> *t )
{ int k=0; if (t==NULL ) //空二叉树 //空二叉树 return 0; if (t所指结点 的度为 k=1 所指结点 的度为1) k=1; d1= NumOfOne ( t->lchild); //递归求左子树叶结点数 //递归求左子树叶结点数 d2= NumOfOne ( t->rchild); } //递归求右子树叶结点数 //递归求右子树叶结点数 return (d1+d2+k);
A B
AOE网络:结点为事件,有向边指向表示事件的执行次序。 网络:结点为事件,有向边指向表示事件的执行次序。 网络 有向边定义为活动,边的权值为活动进行所需要的时间。 有向边定义为活动,边的权值为活动进行所需要的时间。
第7章图_数据结构
v4
11
2013-8-7
图的概念(3)
子图——如果图G(V,E)和图G’(V’,E’),满足:V’V,E’E 则称G’为G的子图
2 1 4 3 5 6 3 5 6 1 2
v1 v2 v4 v3 v2
v1 v3 v4
v3
2013-8-7
12
图的概念(4)
路径——是顶点的序列V={Vp,Vi1,……Vin,Vq},满足(Vp,Vi1),
2013-8-7 5
本章目录
7.1 图的定义和术语 7.2 图的存储结构
7.2.1 数组表示法 7.2.2 邻接表 ( *7.2.3 十字链表 7.3.1 深度优先搜索 7.3.2 广度优先搜索 7.4.1 图的连通分量和生成树 7.4.2 最小生成树
*7.2.4 邻接多重表 )
7.3 图的遍历
连通树或无根树
无回路的图称为树或自由树 或无根树
2013-8-7
18
图的概念(8)
有向树:只有一个顶点的入度为0,其余 顶点的入度为1的有向图。
V1 V2
有向树是弱 连通的
V3
V4
2013-8-7
19
自测题
7. 下列关于无向连通图特性的叙述中,正确的是
2013-8-7
29
图的存贮结构:邻接矩阵
若顶点只是编号信息,边上信息只是有无(边),则 数组表示法可以简化为如下的邻接矩阵表示法: typedef int AdjMatrix[MAXNODE][MAXNODE];
*有n个顶点的图G=(V,{R})的邻接矩阵为n阶方阵A,其定 义如下:
1 A[i ][ j ] 0
【北方交通大学 2001 一.24 (2分)】
数据结构(C语言版)_第7章 图及其应用
实现代码详见教材P208
7.4 图的遍历
图的遍历是对具有图状结构的数据线性化的过程。从图中任 一顶点出发,访问输出图中各个顶点,并且使每个顶点仅被访 问一次,这样得到顶点的一个线性序列,这一过程叫做图的遍 历。
图的遍历是个很重要的算法,图的连通性和拓扑排序等算法 都是以图的遍历算法为基础的。
V1
V1
V2
V3
V2
V3
V4
V4
V5
图9.1(a)
图7-2 图的逻辑结构示意图
7.2.2 图的相关术语
1.有向图与无向图 2.完全图 (1)有向完全图 (2)无向完全图 3.顶点的度 4.路径、路径长度、回路、简单路径 5.子图 6.连通、连通图、连通分量 7.边的权和网 8.生成树
2. while(U≠V) { (u,v)=min(wuv;u∈U,v∈V-U); U=U+{v}; T=T+{(u,v)}; }
3.结束
7.5.1 普里姆(prim)算法
【例7-10】采用Prim方法从顶点v1出发构造图7-11中网所对 应的最小生成树。
构造过程如图7-12所示。
16
V1
V1
V2
7.4.2 广度优先遍历
【例7-9】对于图7-10所示的有向图G4,写出从顶点A出发 进行广度优先遍历的过程。
访问过程如下:首先访问起始顶点A,再访问与A相邻的未被 访问过的顶点E、F,再依次访问与E、F相邻未被访问过的顶 点D、C,最后访问与D相邻的未被访问过的顶点B。由此得到 的搜索序列AEFDCB。此时所有顶点均已访问过, 遍历过程结束。
【例7-1】有向图G1的逻辑结构为:G1=(V1,E1) V1={v1,v2,v3,v4},E1={<v1,v2>,<v2,v3>,<v2,v4>,<v3,v4>,<v4,v1>,<v4,v3>}
数据结构-第7章图答案
7.3 图的遍历 从图中某个顶点出发游历图,访遍图中其余顶点, 并且使图中的每个顶点仅被访问一次的过程。 一、深度优先搜索 从图中某个顶点V0 出发,访问此顶点,然后依次 从V0的各个未被访问的邻接点出发深度优先搜索遍 历图,直至图中所有和V0有路径相通的顶点都被访 问到,若此时图中尚有顶点未被访问,则另选图中 一个未曾被访问的顶点作起始点,重复上述过程, 直至图中所有顶点都被访问到为止。
void BFSTraverse(Graph G, Status (*Visit)(int v)) { // 按广度优先非递归遍历图G。使用辅助队列Q和访问标志数组 visited。 for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; InitQueue(Q); // 置空的辅助队列Q for ( v=0; v<G.vexnum; ++v ) if ( !visited[v]) { // v尚未访问 EnQueue(Q, v); // v入队列 while (!QueueEmpty(Q)) { DeQueue(Q, u); // 队头元素出队并置为u visited[u] = TRUE; Visit(u); // 访问u for ( w=FirstAdjVex(G, u); w!=0; w=NextAdjVex(G, u, w) ) if ( ! visited[w]) EnQueue(Q, w); // u的尚未访问的邻接顶点w入队列Q
4。邻接多重表
边结点
mark ivex
顶点结点
ilink
jvex
jlink
info
data
firstedge
#define MAX_VERTEX_NUM 20 typedef emnu {unvisited, visited} VisitIf; typedef struct Ebox { VisitIf mark; // 访问标记 int ivex, jvex; // 该边依附的两个顶点的位置 struct EBox *ilink, *jlink; // 分别指向依附这两个顶点的下一条 边 InfoType *info; // 该边信息指针 } EBox; typedef struct VexBox { VertexType data; EBox *firstedge; // 指向第一条依附该顶点的边 } VexBox; typedef struct { VexBox adjmulist[MAX_VERTEX_NUM]; int vexnum, edgenum; // 无向图的当前顶点数和边数 } AMLGraph;
《数据结构》第 7 章 图
v3
v4 v5 v4
v3
v5 v4
v3
v5 v4
v3
v5 v4
v3
v5
注
一个图可以有许多棵不同的生成树。 所有生成树具有以下共同特点: 生成树的顶点个数与图的顶点个数相同; 生成树是图的极小连通子图; 一个有 n 个顶点的连通图的生成树有 n-1 条边; 生成树中任意两个顶点间的路径是唯一的; 在生成树中再加一条边必然形成回路。 含 n 个顶点 n-1 条边的图不一定是生成树。
A1 = {< v1, v2>, < v1, v3>, < v3, v4>, < v4, v1>} v1 v2
有向图
v3
v4
制作:计算机科学与技术学院 徐振中
数据结构 边:若 <v, w>∈VR 必有<w, v>∈VR,则以 无序对 (v, w) 代表这两个有序对,表示 v 和 w 之 间的一条边,此时的图称为无向图。 G2 = (V2, E2) V2 = {v1, v2, v3, v4, v5}
第七章 图
E2 = {(v1, v2), (v1, v4), (v2, v3), (v2, v5) , (v3, v4), (v3, v5)} v1
G2
v3
v2
无向图
v4
v5
制作:计算机科学与技术学院 徐振中
数据结构
第七章 图
例:两个城市 A 和 B ,如果 A 和 B 之间的连线的涵义是 表示两个城市的距离,则<A, B> 和 <B, A> 是相同的, 用 (A, B) 表示。 如果 A 和 B 之间的连线的涵义是表示两城市之 间人口流动的情况,则 <A, B> 和 <B, A> 是不同的。 北京 <北京,上海> (北京,上海) <上海,北京> <北京,上海> 北京 上海 上海
数据结构(严蔚敏)第7章 PPT课件
B A
F
2019年12月13日星期五
C
F
E
D 若无向图为非连通图, 则图中各个极大连通
E
子图称作此图的连通
分量。
第16页
对有向图,若任意两个顶点之间都存在
一条有向路径,则称此有向图为强连通图。
否则,其各个强连通子图称作它的 强连通分量。
A
A
B
EB
E
CF
2019年12月13日星期五
第17页
CF
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小连 通子图,称该极小连通子图为此连通图的 生成树。
2019年12月13日星期五
E 顶点的出度: 以顶点v 为弧尾的弧的数目;
顶点的入度: 以顶点v 为弧头的弧的数目。
顶点的度(TD)= 出度(OD)+入度(ID)
第14页
设图G=(V,{VR})中的一个顶点序列
{ u=vi,0,vi,1, …, vi,m=w}中,(vi,j-1,vi,j)VR 1≤j≤m, 则称从顶点u 到顶点w 之间存在一条路径。
2019年12月13日星期五
7.1 图的定义与术语
7.2 图的存储表示
7.3 图的遍历
7.4 最小生成树
7.5 重(双)连通图和关节点
7.6 两点之间的最短路径问题
7.7 拓扑排序
2019年12月13日星期五
7.8 关键路径 第6页
7.1 图的定义与术语
图的结构定义:
图是由一个顶点集 V 和一个弧集 R构成 的数据结构。
struct ArcBox *hlink, *tlink;
} VexNode;
2019年12月13日星期五
数据结构第七章--图(严蔚敏版)
8个顶点的无向图最多有 条边且该图为连通图 个顶点的无向图最多有28条边且该图为连通图 个顶点的无向图最多有 连通无向图构成条件:边 顶点数 顶点数-1)/2 顶点数*(顶点数 连通无向图构成条件 边=顶点数 顶点数 顶点数>=1,所以该函数存在单调递增的单值反 顶点数 所以该函数存在单调递增的单值反 函数,所以边与顶点为增函数关系 所以28个条边 函数 所以边与顶点为增函数关系 所以 个条边 的连通无向图顶点数最少为8个 所以28条边的 的连通无向图顶点数最少为 个 所以 条边的 非连通无向图为9个 加入一个孤立点 加入一个孤立点) 非连通无向图为 个(加入一个孤立点
28
无向图的邻接矩阵为对称矩阵
2011-10-13
7.2
图的存储结构
Wij 若< vi,vj > 或<vj,v i > ∈E(G)
若G是网(有权图),邻接矩阵定义为 是网(有权图), ),邻接矩阵定义为
A [ i,j ] = , 0或 ∞
如图: 如图:
V1
若其它
V2
3 4
2
V3
2011-10-13
C
A
B
D 2011-10-13 (a )
3
Königsberg七桥问题
• Königsberg七桥问题就是说,能否从某点出发 通过每桥恰好一次回到原地?
C
C
A B
.
A D
B
D (a)
2011-10-13
(b)
4
第七章 图
7.1 图的定义 7.2 图的存储结构 7.3 图的遍历 7.4 图的连通性问题 7.5 有向无环图及其应用 7.6 最短路径
2011-10-13
第7章 图
假设一个连通图有 n 个顶点和 e 条边, 其中 n-1 条边和 n 个顶点构成一个极小 连通子图,称该极小连通子图为此连通图 的生成树 生成树。 生成树 B A F E C D 对非连通图,则 称由各个连通分 量的生成树的集 合为此非连通图 的生成森林 生成森林。 生成森林
基本操作
结构的建立和销毁 对顶点的访问操作 插入和删除顶点 插入和删除弧 对邻接点的操作 遍历
假若顶点v 和顶点w 之间存在一条边, 则称顶点v 和w 互为邻接点 邻接点, 邻接点
边(v,w) 和顶点v 和w 相关联 相关联。 和顶点v相关联的边的数目 边的数目定义为顶点v的度, 边的数目 度 记为TD(v)。 记为TD( TD
B A F
C D E
例如: 例如: 右侧图中 TD(B) = 3 TD(A) = 2
个顶点相同的路径。
若图G中任意两个顶 点之间都有路径相通, 则称此图为连通图 连通图; A 连通图 B A F E C D
B
C D
F
E
若无向图为非连通图, 则图中各个极大连通 子图称作此图的连通 连通 分量。 分量
若任意两个顶点之间都存在 对有向图, 对有向图, 一条有向路径,则称此有向图为强连通图 强连通图。 强连通图 否则,其各个强连通子图称作它的 强连通分量。 强连通分量 A B C F E B C F A E
// 点”。若 w 是 v 的最后一个邻接点,则 // 返回“空”。
插入和删除顶点
InsertVex(&G, v); //在图G中增添新顶点v。 DeleteVex(&G, v); // 删除G中顶点v及其相关的弧。
插入和删除弧
InsertArc(&G, v, w); // 在G中增添弧<v,w>,若G是无向的, //则还增添对称弧<w,v>。 DeleteArc(&G, v, w); //在G中删除弧<v,w>,若G是无向的, //则还删除对称弧<w,v>。
数据结构 习题 第七章 图 答案
第7章图二.判断题部分答案解释如下。
2. 不一定是连通图,可能有若干连通分量 11. 对称矩阵可存储上(下)三角矩阵14.只有有向完全图的邻接矩阵是对称的 16. 邻接矩阵中元素值可以存储权值21. 只有无向连通图才有生成树 22. 最小生成树不唯一,但最小生成树上权值之和相等26. 是自由树,即根结点不确定35. 对有向无环图,拓扑排序成功;否则,图中有环,不能说算法不适合。
42. AOV网是用顶点代表活动,弧表示活动间的优先关系的有向图,叫顶点表示活动的网。
45. 能求出关键路径的AOE网一定是有向无环图46. 只有该关键活动为各关键路径所共有,且减少它尚不能改变关键路径的前提下,才可缩短工期。
48.按着定义,AOE网中关键路径是从“源点”到“汇点”路径长度最长的路径。
自然,关键路径上活动的时间延长多少,整个工程的时间也就随之延长多少。
三.填空题1.有n个顶点,n-1条边的无向连通图2.有向图的极大强连通子图3. 生成树9. 2(n-1) 10. N-1 11. n-1 12. n 13. N-1 14. n15. N16. 3 17. 2(N-1) 18. 度出度 19. 第I列非零元素个数 20.n 2e21.(1)查找顶点的邻接点的过程 (2)O(n+e) (3)O(n+e) (4)访问顶点的顺序不同 (5)队列和栈22. 深度优先 23.宽度优先遍历 24.队列25.因未给出存储结构,答案不唯一。
本题按邻接表存储结构,邻接点按字典序排列。
25题(1) 25题(2) 26.普里姆(prim )算法和克鲁斯卡尔(Kruskal )算法 27.克鲁斯卡尔28.边稠密 边稀疏 29. O(eloge ) 边稀疏 30.O(n 2) O(eloge) 31.(1)(V i ,V j )边上的权值 都大的数 (2)1 负值 (3)为负 边32.(1)n-1 (2)普里姆 (3)最小生成树 33.不存在环 34.递增 负值 35.16036.O(n 2) 37. 50,经过中间顶点④ 38. 75 39.O(n+e )40.(1)活动 (2)活动间的优先关系 (3)事件 (4)活动 边上的权代表活动持续时间41.关键路径 42.(1)某项活动以自己为先决条件 (2)荒谬 (3)死循环 43.(1)零 (2)V k 度减1,若V k 入度己减到零,则V k 顶点入栈 (3)环44.(1)p<>nil (2)visited[v]=true (3)p=g[v].firstarc (4)p=p^.nextarc45.(1)g[0].vexdata=v (2)g[j].firstin (3)g[j].firstin (4)g[i].firstout (5)g[i].firstout (6)p^.vexj (7)g[i].firstout (8)p:=p^.nexti (9)p<>nil (10)p^.vexj=j(11)firstadj(g,v 0) (12)not visited[w] (13)nextadj(g,v 0,w)46.(1)0 (2)j (3)i (4)0 (5)indegree[i]==0 (6)[vex][i] (7)k==1 (8)indegree[i]==047.(1)p^.link:=ch[u ].head (2)ch[u ].head:=p (3)top<>0 (4)j:=top (5)top:=ch[j].count(6)t:=t^.link48.(1)V1 V4 V3 V6 V2 V5(尽管图以邻接表为存储结构,但因没规定邻接点的排列,所以结果是不唯一的。
C语言- 图
7.1 图的定义
7.稀疏图和稠密图
具有e<nlogn条弧或边的图,称为稀疏图。反之,称为稠密图。
8.生成树
一个连通图的生成树是一个极小连通子图,它含有图的全部顶点, 但只有足以构成一棵树的n-1条边。。如果在该生成树中添加一条边, 则一定会在图中出现一个环。一棵具有n个顶点的生成树仅有n-1条边, 如果少于n-1条边,则该图是非连通的。多于n-1条边,则一定有环的 出现。反过来,具有n-1条边的图不一定能构成生成树。一个图的生成 树不一定是唯一的。图是无向图G5中最大连通分量的一棵生成树。
在图所示的有向图G1中,顶点序列a→d→c→a构成了一个简 单回路。在无向图G2中,从顶点a到顶点c所经过的路径为a,d和c (或a、b、c)。
7.1 图的定义
4.子图 假设存在两个图G={V,E}和G’={V’,E’},若G’的顶点和关系都是 V的子集,即有V’V,E’E,则G’为G的子图。如图所示。
广度遍历。
7.2 图的存储结构
7.2.1 邻接矩阵(数组表示法)
1.什么是图的邻接矩阵 图的邻接矩阵可利用两个数组实现:一个一维数组用来存储图中的 顶点信息;另一个二维数组用来存储图中的顶点之间的关系,该二维 数组被称为邻接矩阵。如果图是一个无权图,则邻接矩阵表示为:
A[i][j]=
1 当<vi,vj>∈E或(vi,vj)∈E 0 反之
7.1 图的定义
2.顶点的度
对于无向图,顶点v的度是指与v相关联的边的数目,记作TD(v)。 对于有向图,以顶点v为弧头的数目称为顶点v的入度(indegree), 记作ID(v)。以顶点v为弧尾的数目称为v的出度(outdegree),记作 OD(v)。顶点v的度(degree)为TD(v)=ID(v)+OD(v)。
第7章图(Graphs)
7.1 图的概念及术语
v1 v3 有向边<v3, v4> V3:始点, v4: 终点 v2 v4
图的构成: • 结点集:V={v1,v2,v3,v4}, • 有向边集:E={<v1,v3>,<v1,v2>,<v3,v4>,<v4,v1>}
7.1 图的概念及术语
v1 v3 v2 v4 v1 v2
v3
为从顶点vi 到顶点 vj 的路径。 • 路径长度 –非带权图的路径长度是指此路径上的边数。 –带权图的路径长度是指路径上各边的权之和
7.1 图的概念及术语
• 简单路径 若路径上各顶点 v1,v2,...,vm 均不互相重 复, 则称这样的路径为简单路径。 • 回路 若路径上第一个顶点 v1 与最后一个顶点vm 重合, 则称这样的路径为回路或环。 • 连通图与连通分量 在无向图中, 若从顶点v1到顶 点v2有路径, 则称顶点v1与v2是连通的。 • 如果图中任意一对顶点都是连通的, 则称此图是连 通图。 • 非连通图的极大连通子图叫做连通分量.
7.1 图的概念及术语
v1
v2
v4Βιβλιοθήκη v3路径: (1) <v1, v3>, <v3, v4> (简单路径)
(2) <v1, v3>, <v3, v4>, <v4, v1> (环)
(3) <v3, v4>
7.1 图的概念及术语
• 路径: 在图 G=(V, E) 中, 若存在边的序列 (vi, vp1)、(vp1, vp2)、...、(vpm, vj) 则称顶点序列 ( vi vp1 vp2 ... vpm vj )
v4 v5
数据结构:第7章 图3-最小生成树
• 按照生成树的定义,n 个顶点的连通网络的生成树有 n
个顶点、n-1 条边。
即有权图
目标:
在网络的多个生成树中,寻找一个各边权值之和最小的
生成树。
构造最小生成树的准则 ❖ 必须只使用该网络中的边来构造最小生成树;
❖ 必须使用且仅使用n-1条边来联结网络中的n个顶点;
❖ 不能使用产生回路的边。
典型用途:
(b) u={1} w={2,3,4,5,6}
0 6 1 5
6
0
5
3
1 5 0 7 5 4
5
7
0
2
3 5 0 6
4 2 6 0
i
1234
closest[i] 1 1 1 1
lowcost[i] 0 6 1 5
56 11 ∞∞
closest用于存放顶点序号 lowest存放权值
15 4 6
1 25
3
54
5
6
(c ) u={1,3} w={2,4,5,6}
1
1
4
25
6
32
54
5
6
(d) u={1,3,6} w={2,4,5}
i
1234 5 6
closest[i] 1 3 1 1 3 3
lowcost[i] 0 5 0 5 5 4
i
1234 5 6
closest[i] 1 3 1 6 3 3
生
v3 v1
成
树 v4 v2
v1
0^ 1^ 0^ 1^
2.生成森林
若一个图是非连通图或非强连通图,但有若 干个连通分量或若干个强连通分量,则通过 深度优先搜索遍历或广度优先搜索遍历,不 可以得到生成树,但可以得到生成森林,且 若非连通图有 n 个顶点,m 个连通分量或强 连通分量,则可以遍历得到m棵生成树,合 起来为生成森林,森林中包含n-m条树边。
数据结构 C语言版(严蔚敏版)第7章 图
1
2
4
1
e6 2 4
2016/11/7
29
7.3 图的遍历
从已给的连通图中某一顶点出发,沿着一 些边访遍图中所有的顶点,且使每个顶点 仅被访问一次,就叫做图的遍历 ( Graph Traversal )。 图中可能存在回路,且图的任一顶点都可 能与其它顶点相通,在访问完某个顶点之 后可能会沿着某些边又回到了曾经访问过 的顶点。 为了避免重复访问,可设置一个标志顶点 是否被访问过的辅助数组 visited [ ]。
2
1 2
V2
V4
17
结论:
无向图的邻接矩阵是对称的; 有向图的邻接矩阵可能是不对称的。 在有向图中, 统计第 i 行 1 的个数可得顶点 i 的出度,统计第 j 行 1 的个数可得顶点 j 的入度。 在无向图中, 统计第 i 行 (列) 1 的个数可得 顶点i 的度。
2016/11/7
18
2
邻接表 (出度表)
adjvex nextarc
data firstarc
0 A 1 B 2 C
2016/11/7
1 0 1
逆邻接表 (入度表)
21
网络 (带权图) 的邻接表
6 9 0 2 1 C 2 8 3 D
data firstarc Adjvex info nextarc
2016/11/7
9
路径长度 非带权图的路径长度是指此路径 上边的条数。带权图的路径长度是指路径 上各边的权之和。 简单路径 若路径上各顶点 v1,v2,...,vm 均不 互相重复, 则称这样的路径为简单路径。 回路 若路径上第一个顶点 v1 与最后一个 顶点vm 重合, 则称这样的路径为回路或环。
第7章图(Graph)
• 1.带方向的边叫有向边(directed edge),简 称为弧; • 用顶点的有序对表示,<vi ,vj>和<vj ,vi> 是不同的 . • 2. 而不带方向的边叫无向边(undirected edge),简称为边。 • 用顶点的无序对表示,(vi ,vj)和(vj ,vi)表 示同一条边。 • • <vi,vj >表示从顶点vi到vj 的一段弧 • Vi:称为边的始点或者弧尾 • Vj:称为边的终点或者弧头
• 2e= • 例:
1 1
TD(v )
i 1 i
n
2 2
• 2*1=1+1
2*2=2+2
• (5)路径与回路:路径上边的数目称为路径长度。 • 下图所示的无向图中,顶点v1到顶点v5的路径有两条,分别 为(v1,v2,v3,v5)与(v1,v4,v5),路径长度分别为3和2。
1 2 5 3
• 如果路径的起点和终点相同 (即vp=vq),则称此路径为回路 4 或环。序列中顶点不重复出现的路径称为简单路径, 图 7.3 图的路径 • 上图所示的v1到v5的两条路径都为简单路径。除第一顶点与 最后一个顶点之外,其它顶点不重复现的回路为简单回路 或者简单环。
第7章 图(Graph)
图是一种比树更为复杂的非线性数据结构。 1.线性表: 数据元素之间仅有线性关系. (每个elem只有一个直接前驱和一个直接后继) 2.树形结构:elem之间有明显的层次关系. (每一层上的数据元素可能和下一层中多个元素相关,但 只能和上一层中一个元素(双亲)相关) 3.图形结构:结点之间的关系可以是任意的. (图中任意两个数据元素之间都可能相关联 ) 图的应用十分广泛。最典型的应用领域有电路分析、 寻找最短路线、项目规划、鉴别化合物、统计力学、遗 传学、控制论、语言学,乃至社会科学。实际上,在所 有的数据结构中,图的应用是最广泛的。
DS07-图-数据结构(C语言版)(第2版)-唐国民-清华大学出版社
第七章
图
7.2
图的存储结构
图是由两部分组成,一部分是图的 顶点信息,另一部分是图顶点间的关系 信息(边)。所以要想将图的全部信息存 储到计算机中,也必须将顶点的信息和 顶点间的关系信息都存储。
第七章
图
一、图的邻接矩阵存储
设图 G = (V, E)是一个有 n 个顶点的图, 有一个记录各个顶点信息v0 ,v1, v2, …, vn-1 的顶点表,可以用顺序方式或链式方式来存储 顶点表;而图的边用一个二维数组表示,它是 一个n×n的矩阵(邻接矩阵),用于表示顶点 之间的邻接关系。定义为:
W (i , j ), A.Edge [i ][ j ] = , aij 0,
A
第七章
图
邻接矩阵表示法中图的类型定义:
#define MAXSIZE 100 /*图的顶点个数*/ typedef int datatype; typedef struct { datatype vexs[MAXSIZE]; /*顶点信息表*/ int edges[MAXSIZE][ MAXSIZE];/*邻接矩阵*/ int n,e ; /*顶点数和边数*/ }graph;
B A C E D
A B vexs C D E
有向图
0 0 edges 0 0 0
1 1 1 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0
第七章
图
2
20
40
5
子图:设有两个图 G=(V, E) 和 G’=(V’, E’)。 若V’ V 且 E’E, 则称图G’是图G的子图。
第七章
图
路径:在图 G=(V, E) 中, 若存在一个顶点序列vp1, vp2,
数据结构:第7章 图4-拓扑排序和关键路径
拓扑排序算法
拓扑排序方法: (1)在AOV网中选一个入度为0的顶点(没有前驱) 且输出之; (2)从AOV网中删除此顶点及该顶点发出来的所 有有向边; (3)重复(1)、(2)两步,直到AOV网中所有 顶点都被输出或网中不存在入度为0的顶点。
从拓扑排序步骤可知,若在第3步中,网中所有顶 点都被输出,则表明网中无有向环,拓扑排序成功。 若仅输出部分顶点,网中已不存在入度为0的顶点, 则表明网中有有向环,拓扑排序不成功。
拓扑序列:C1--C2--C3 (3)
C12 C9 C10
C7 C8 C6
C11
拓扑序列:C1--C2--C3--C4 (4)
C7
C12
C12
C8
C8 C9 C10
C6
C9 C10
C6
C11
C11 拓扑序列:C1--C2--C3--C4--C5
(5)
拓扑序列:C1--C2--C3--C4--C5--C7 (6)
在 (b)中,我们用一种有向图来表示课程开设
拓扑排序
1.定义 给出有向图G=(V,E),对于V中的顶点的线性序列 (vi1,vi2,...,vin),如果满足如下条件:若在G中从 顶点 vi 到vj有一条路径,则在序列中顶点vi必在 顶点 vj之前;则称该序列为 G的一个拓扑序列。 构造有向图的一个拓扑序列的过程称为拓扑排序。 2.说明 (1)在AOV网中,若不存在回路,则所有活动可排成 一个线性序列,使得每个活动的所有前驱活动都排 在该活动的前面,那么该序列为拓扑序列. (2)拓扑序列不是唯一的.
2.AOV网实际意义
现代化管理中, 通常我们把计划、施工过程、生产流程、 程序流程等都当成一个工程,一个大的工程常常被划分 成许多较小的子工程,这些子工程称为活动。在整个工 程实施过程中,有些活动开始是以它的所有前序活动的 结束为先决条件的,必须在其它有关活动完成之后才能 开始,有些活动没有先决条件,可以 安排在任意时间开 始。AOV网就是一种可以形象地反映出整个工程中各个 活动之间前后关系的有向图。例如,计算机专业学生的 课程开设可看成是一个工程,每一门课程就是工程中的 活动,下页图给出了若干门所开设的课程,其中有些课 程的开设有先后关系,有些则没有先后关系,有先后关 系的课程必须按先后关系开设,如开设数据结构课程之 前必须先学完程序设计基础及离散数学,而开设离散数 学则必须先并行学完数学、程序设计基础课程。
数据结构第7章图3有向无环图及其应用ppt课件
for(p=G.vertices[i].firstarc; p; p=p->nextarc){ k=p—>adivex;//对i号顶点的每个邻接点入度减1 if(!(--indegree[k])) Push(S,k); //若入度减为0,则入栈
§7.5 有向无环图及其应用
❖有向无环图
在工程实践中,一个工程项目往往由若干个子项 目组成,这些子项目间往往有多种关系:
①先后关系,即必须在一子项目完成后,才能开 始实施另一个子项目;
②子项目之间无次序要求,即两个子项目可以同 时进行,互不影响。
§7.5 有向无环图及其应用
❖两种常用的活动网络(Activity Network)
3
4 4^
4
2 1^ 3^
1^
s
0 V1 3 V4
5 V6
4
V2 1 V3 2 V5 4
indegree[0..5] 0 0 0 0 0 0 012345
最后输出的拓扑序列为:v6v1v3v2v4v5
§7.5 有向无环图及其应用
G.vertices[0] v1
3
2
G.vertices[1] v打2 印^G.vertices[4].data
1. 输入AOV网络。令 n 为顶点个数。 2. 在AOV网络中选一个没有直接前驱的顶点, 并输出之; 3. 从图中删去该顶点, 同时删去所有它发出的有向边; 4. 重复以上 2、3 步, 直到:
全部顶点均已输出,拓扑有序序列形成,拓扑排序完成 或者,图中还有未输出的顶点,但已跳出处理循环。这说 明图中还剩下一些顶点,它们都有直接前驱,再也找不到 没有前驱的顶点了。这时AOV网络中必定存在有向环。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
GraphKind
kind;
// 图的种类标志
乐山师范学院计算机科学系
网的邻接矩阵
W(i , j ), 若i j且 i, j E或(i, j ) E A.e dge [i ][ j ] , 若i j且 i, j E或(i, j ) E 0, 若i j
主讲教师:孙锐
2 0
乐山师范学院计算机科学系
邻接表表示法特点: 1)无向图邻接表边结点数是边数的两倍. 2)顶点vi的度:在无向图中等于第i个链表中的结点 数;在有向图邻接表中,第i行的结点数等于顶点i的 出度,在有向图逆邻接表中,第i行的结点数等于顶点 i的入度。 3)在邻接表上容易找到任一顶点的第一个邻接点和 下一个邻接点 4)设存储顶点的一维数组大小为n(图的顶点数n),G 占用存储空间:n+e;G占用存储空间与它的顶点数和 边数有关;适用于边稀疏的图;
对有向图,若任意两个顶点之间都存在一条 有向路径,则称此有向图为强连通图。否则,其 各个强连通子图称作它的强连通分量。
A
A
B
C F
E
B C F
E
主讲教师:孙锐
乐山师范学院计算机科学系
生成树、生成森林 假设一个连通图有 n 个顶点和 e 条边,其中 n-1 条边和 n 个顶点构成一个极小连通子图,称该极小连 通子图为此连通图的生成树。
} ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { // 图的定义 VertexType AdjMatrix int } MGraph;
主讲教师:孙锐
vexs[MAX_VERTEX_NUM]; // 顶点信息 arcs;
主讲教师:孙锐
乐山师范学院计算机科学系
邻接矩阵表示法定义:(C语言描述) typedef struct ArcCell { // 弧的定义
VRType
InfoType
adj;
*info;
// VRType是顶点关系类型;对无权图,用1
或0表示相邻否;对带权图,则为权值类型。 // 该弧相关信息的指针
W
A B C D E
乐山师范学院计算机科学系
主讲教师:孙锐
由顶点集和边集构成的图称作无向图。
若<v, w>VR 必有<w, v>VR, 则称 (v,w) 为顶点v 和顶点 w 之间存在一条边。
B A
C D
F
主讲教师:孙锐
E
乐山师范学院计算机科学系
名词和术语
网、子图
15
A
21
2
9 11
B E
A B C F
B
3
7
C
F
E
设图G=(V,{VR}) 和图 G=(V,{VR}),且 VV, VRVR,则称 G 为 G 的子图。
主讲教师:孙锐
乐山师范学院计算机科学系
完全图、稀疏图、稠密图 假设图中有 n 个顶点,e 条边,则含有 e=n(n-1)/2 条边的无向图称作完全图;含有 e=n(n-1) 条弧的有向图 称作有向完全图;若边或弧的个数 e<nlogn,则称作稀疏 图,否则称作稠密图。 邻接点、度、入度、出度 假若顶点v 和顶点w 之间 存在一条边,则称顶点v 和 w 互为邻接点,边(v,w) 和 顶点v 和w 相关联。 和顶点v 关联的边的数目 定义为顶点v的度。
例如:
主讲教师:孙锐
B
C
A F E
D
ID(B) = 3 ID(A) = 2
乐山师范学院计算机科学系
顶点的出度: 以顶点v为弧尾的弧的数目
顶点的入度: 以顶点v为弧头的弧的数目
顶点的度(TD)=出度(OD)+入度(ID)
A
例如: OD(B) = 1 ID(B) = 2 TD(B) = 3
B
C
主讲教师:孙锐
15
A
21
2
9 11
B
3
7
D
C
E
0 15 ∞ 9 ∞ ∞ 0 3 ∞ ∞ A.edge = ∞ ∞ 0 ∞ 2 ∞ ∞ 21 0 ∞ 11 7 ∞ ∞ 0
乐山师范学院计算机科学系
主讲教师:孙锐
图的邻接表存储表示
B A
C D
0 1 2 3 4 5
主讲教师:孙锐
乐山师范学院计算机科学系
邻接表表示法定义:(JAVA语言描述) class ArcNode {
int adjvex; // 该弧所指向的顶点的位置 ArcNode nextarc; // 指向下一条弧的指针 InfoType info; // 该弧相关信息的指针 } class VNode { VertexType data; // 顶点信息 ArcNode firstarc; // 指向第一条依附该顶点的弧 } class ALGraph{
// 弧的信息 // 顶点数,弧数
vexnum, arcnum;
GraphKind
kind;
// 图的种类标志
乐山师范学院计算机科学系
邻接矩阵表示法定义:(JAVA语言描述) class ArcCell { // 弧的定义
VRType
InfoType }
adj;
info;
// VRType是顶点关系类型;对无权图,用1
1
2 3 0 2
4
C
D
2 C 3 D
可见,在有向图的 邻接表中不易找到指向 该顶点的弧。
主讲教师:孙锐
1
4 E
乐山师范学院计算机科学系
有向图的逆邻接表
A B E
0 A 1 B 2 C 3 D 4 E
3 3 4 0
C
D
在有向图的邻接表 中,对每个顶点,链接 的是指向该顶点的弧。
// 对v的尚未访问的邻接顶点w // 递归调用DFS
} // DFS
主讲教师:孙锐
乐山师范学院计算机科学系
如果图中仍有顶点未被访问,则以该顶点为起始点,
进行深度优先搜索遍历,否则继续检查下一顶点。
void DFSTraverse(Graph G, Status (*Visit)(int v)) {
主讲教师:孙锐
0 1 0 0 1 0
1 0 0 0 1 1
0 0 0 1 0 1
0 0 1 0 0 1
1 1 0 0 0 0
0 1 1 1 0 0
乐山师范学院计算机科学系
A
A A B
B
C
D
E
B
C E
D
C D E
0 0 0 0 1
1 0 0 0 1
0 1 0 1 0
1 0 0 0 0
0 0 1 0 0
第七章 图
主要内容:
图的基本概念和术语 图的存储结构 图的遍历 图的连通性问题
有向无环图及应用 最短路径求解
主要目标:
熟练掌握图的邻接矩阵和邻接表的存储方式 实现图的一些基本运算,特别是深度遍历和广度遍历 掌握以图为基础的一些常用算法,如最小生成树、拓扑排序、 最短路径等
E
F
乐山师范学院计算机科学系
路径、路径长度、简单路径、简单回路 设图G=(V,{VR})中的一个顶点序列{ u=vi,0,vi,1, …, vi,m=w}中,(vi,j-1,vi,j)VR 1≤j≤m,则称从顶点u 到顶 点w 之间存在一条路径。 路径上边的数目称作路径长度。 简单路径:序列中顶点不重复出现的路径。 简单回路:序列中第一个顶点和最后一个顶点相同的路径。
或0表示相邻否;对带权图,则为权值类型。 // 该弧相关信息的指针
class MGraph{ // 图的定义 VertexType int };
主讲教师:孙锐
vexs[MAX_VERTEX_NUM]; // 顶点信息
// 弧的信息 // 顶点数,弧数
ArcCell[][] arcs; vexnum, arcnum;
A
B
C
主讲教师:孙锐
E
F
如:长度为3的路径{A,B,C,F}
乐山师范学院计算机科学系
连通图、连通分量、强连通图、强连通分量
若图G中任意两个顶点 之间都有路径相通,则称 此图为连通图; 若无向图为非连通图, 则图中各个极大连通子图称 作此图的连通分量。
B A F
C D E
主讲教师:孙锐
乐山师范学院计算机科学系
// 对图 G 作深度优先遍历。
VisitFunc = Visit; for (v=0; v<G.vexnum; ++v) visited[v] = FALSE; // 访问标志数组初始化 for (v=0; v<G.vexnum; ++v) if (!visited[v]) DFS(G, v);
主讲教师:孙锐
乐山师范学院计算机科学系
邻接表表示法定义:(C语言描述) typedef struct ArcNode {
int adjvex; // 该弧所指向的顶点的位置 struct ArcNode *nextarc; // 指向下一条弧的指针 InfoType *info; // 该弧相关信息的指针 } ArcNode; typedef struct VNode { VertexType data; // 顶点信息 ArcNode *firstarc; // 指向第一条依附该顶点的弧 } VNode, AdjList[MAX_VERTEX_NUM]; typedef struct { AdjList vertices; int vexnum, arcnum; int kind; // 图的种类标志 } ALGraph;