数据结构第7章 图

合集下载

数据结构章节练习题-答案第7章图

数据结构章节练习题-答案第7章图

7.1 选择题1. 对于一个具有n个顶点和e条边的有向图,在用邻接表表示图时,拓扑排序算法时间复杂度为()A) O(n)B)O(n+e)C) O(n*n)D)O(n*n*n)【答案】B2. 设无向图的顶点个数为n,则该图最多有()条边。

A) n-1B)n(n-1)/2C)n(n+1)/2【答案】B3. 连通分量指的是()A) 无向图中的极小连通子图B) 无向图中的极大连通子图C) 有向图中的极小连通子图D) 有向图中的极大连通子图【答案】B4. n 个结点的完全有向图含有边的数目()A) n*n B) n(n+1) C) n/2【答案】D5. 关键路径是()A) AOE网中从源点到汇点的最长路径B) AOE网中从源点到汇点的最短路径C) AOV网中从源点到汇点的最长路径D) n2D) n* (n-1)D) AOV网中从源点到汇点的最短路径【答案】 A 6.有向图中一个顶点的度是该顶点的()A)入度B)出度C)入度与出度之和D)(入度+出度)12【答案】C7.有e 条边的无向图,若用邻接表存储,表中有()边结点。

A) e B) 2eC) e-1D) 2(e-1)【答案】B8.实现图的广度优先搜索算法需使用的辅助数据结构为()A)栈B)队列C)二叉树D)树【答案】B9.实现图的非递归深度优先搜索算法需使用的辅助数据结构为()A)栈B)队列C)二叉树D)树【答案】 A 10.存储无向图的邻接矩阵一定是一个()A)上三角矩阵B)稀疏矩阵C)对称矩阵D)对角矩阵【答案】C11.在一个有向图中所有顶点的入度之和等于出度之和的()倍A) B) 1C) 2D) 4答案】B12.在图采用邻接表存储时,求最小生成树的Prim 算法的时间复杂度为(A) O(n)B) O(n+e)C 0(n2)D) 0(n3))【答案】B13 .下列关于AOE网的叙述中,不正确的是()A) 关键活动不按期完成就会影响整个工程的完成时间B) 任何一个关键活动提前完成,那么整个工程将会提前完成C) 所有的关键活动提前完成,那么整个工程将会提前完成D) 某些关键活动提前完成,那么整个工程将会提前完成【答案】B14. 具有10 个顶点的无向图至少有多少条边才能保证连通()A ) 9B) 10C) 11D) 12【答案】A15. 在含n 个顶点和e 条边的无向图的邻接矩阵中,零元素的个数为()A)e B)2eC)n2-e D)n2-2e【答案】D7.2 填空题1 .无向图中所有顶点的度数之和等于所有边数的________________ 倍。

第7章图_数据结构

第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分)】

数据结构课后习题答案第七章

数据结构课后习题答案第七章

第七章图(参考答案)7.1(1)邻接矩阵中非零元素的个数的一半为无向图的边数;(2)A[i][j]= =0为顶点,I 和j无边,否则j和j有边相通;(3)任一顶点I的度是第I行非0元素的个数。

7.2(1)任一顶点间均有通路,故是强连通;(2)简单路径V4 V3 V1 V2;(3)0 1 ∞ 1∞ 0 1 ∞1 ∞ 0 ∞∞∞ 1 0邻接矩阵邻接表(2)从顶点4开始的DFS序列:V5,V3,V4,V6,V2,V1(3)从顶点4开始的BFS序列:V4,V5,V3,V6,V1,V27.4(1)①adjlisttp g; vtxptr i,j; //全程变量② void dfs(vtxptr x)//从顶点x开始深度优先遍历图g。

在遍历中若发现顶点j,则说明顶点i和j间有路径。

{ visited[x]=1; //置访问标记if (y= =j){ found=1;exit(0);}//有通路,退出else { p=g[x].firstarc;//找x的第一邻接点while (p!=null){ k=p->adjvex;if (!visited[k])dfs(k);p=p->nextarc;//下一邻接点}}③ void connect_DFS (adjlisttp g)//基于图的深度优先遍历策略,本算法判断一邻接表为存储结构的图g种,是否存在顶点i //到顶点j的路径。

设 1<=i ,j<=n,i<>j.{ visited[1..n]=0;found=0;scanf (&i,&j);dfs (i);if (found) printf (” 顶点”,i,”和顶点”,j,”有路径”);else printf (” 顶点”,i,”和顶点”,j,”无路径”);}// void connect_DFS(2)宽度优先遍历全程变量,调用函数与(1)相同,下面仅写宽度优先遍历部分。

数据结构第七章:图

数据结构第七章:图


a c G1
b d
vexdata firstarc adjvex next 1 4 ^ a 2 3 4 b c d 1 1 3 ^ ^ ^
19
7.3 图的遍历
深度优先遍历(DFS) 深度优先遍历
方法:从图的某一顶点 出发,访问此顶点; 方法:从图的某一顶点V0出发,访问此顶点;然后依 次从V 的未被访问的邻接点出发,深度优先遍历图, 次从 0的未被访问的邻接点出发,深度优先遍历图, 直至图中所有和V 相通的顶点都被访问到; 直至图中所有和 0相通的顶点都被访问到;若此时图 中尚有顶点未被访问, 中尚有顶点未被访问,则另选图中一个未被访问的顶 点作起点,重复上述过程, 点作起点,重复上述过程,直至图中所有顶点都被访 问为止。 问为止。
ω ij , 若(v i , v j )或 < v i , v j >∈ E(G) A[i, j ] = 0,其它
11

1 3
5
2
8 4 7 5 1 6 3 4 2
0 5 7 0 3
5 0 0 4 8
7 0 0 2 1
0 4 2 0 6
3 8 1 6 0
12
关联矩阵——表示顶点与边的关联关系的矩阵 表示顶点与边的关联关系的矩阵 关联矩阵
1
7.1 图的定义和术语
是由两个集合V(G)和E(G)组成的 组成的, 图(Graph)——图G是由两个集合 图 是由两个集合 和 组成的 记为G=(V,E) 记为
其中: 其中:V(G)是顶点的非空有限集 是顶点的非空有限集 E(G)是边的有限集合,边是顶点的无序对或有序对 是边的有限集合, 是边的有限集合
有向图——有向图 是由两个集合 有向图G是由两个集合 有向图 有向图 是由两个集合V(G)和E(G)组成的 和 组成的

北京理工大学数据结构图课件

北京理工大学数据结构图课件
A
B C D
第 5 页
E
7.1 图的定义与术语
3、无向图——无向图G是由两个集合V(G)和 E(G)组成的。 其中:V(G)是顶点的非空有限集。 E(G)是边的有限集合,边是顶点的 无序对,记为 (v,w) 或 (w,v),并且 (v,w)=(w,v)。
第 6 页
7.1 图的定义与术语

例如:
G2 = <V2,E2> V2 = { v0 ,v1,v2,v3,v4 } E2 = { (v0,v1), (v0,v3), (v1,v2), (v1,v4), (v2,v3), (v2,v4) }
V5
第 15 页
7.1 图的定义与术语
非 连 通 图
V0
V1
V2
V3
V0
V1 V3
V2
强连通分量
第 16 页
7.1 图的定义与术语
7、生成树
包含无向图 G 所有顶点的极小连通子图称为G生 成树。 极小连通子图意思是:该子图是G的连通子图, 在该子图中删除任何一条边,子图不再连通。
V0 V2 V3 V4 V3 连通图G1 V1 V0 V1 连通 所有顶点 V4 无回路
第 22 页
7.2 图的存储结构 3、有向图的逆邻接表 顶点:用一维数组存储(按编号顺序) 以同一顶点为终点的弧:用线性链表存储。
vexdata V0 V1 0 1 v0 v1 v2
v3
firstarc 3 0 0 ^ ^
V2
V3
2 3
^
^
2
章 类似于有向图的邻接表,所不同的是: 以同一顶点为终点弧:用线性链表存储
Boolean visited[MAX]; // 访问标志数组

第7章图(2)-数据结构教程(Python语言描述)-李春葆-清华大学出版社

第7章图(2)-数据结构教程(Python语言描述)-李春葆-清华大学出版社

4/59
或者
def DFS1(G,v): print(v,end=' ') visited[v]=1 for p in G.adjlist[v]: w=p.adjvex if visited[w]==0: DFS1(G,w)
#邻接表G中从顶点v出发的深度优先遍历 #访问顶点v #置已访问标记 #处理顶点v的所有出边顶点 #取顶点v的一个邻接点w
图采用邻接矩阵为存储结构,其广度优先遍历算法如下:
from collections import deque
MAXV=100
#全局变量,表示最多顶点个数
visited=[0]*MAXV
def BFS(g,v):
#邻接矩阵g中顶点v出发广度优先遍历
qu=deque()
#将双端队列作为普通队列qu
print(v,end=" ")
#访问顶点v
visited[v]=1
#置已访问标记
qu.append(v)
#v进队
while len(qu)>0:
#队不空循环
v=qu.popleft()
#出队顶点v
for w in range(g.n):
if g.edges[v][w]!=0 and g.edges[v][w]!=INF:
#全局变量,表示最多顶点个数
#邻接表G中顶点v出发广度优先遍历 #将双端队列作为普通队列qu #访问顶点v #置已访问标记 #v进队
#队不空循环 #出队顶点v
#处理顶点v的所有出边 #取顶点v的第j个出边邻接点w #若w未访问 #访问顶点w #置已访问标记 #w进队
时间复杂度为O(n+e)。
11/59

数据结构(C语言版)_第7章 图及其应用

数据结构(C语言版)_第7章 图及其应用
(1)创建有向图邻接表 (2)创建无向图的邻接表
实现代码详见教材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章图(下)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社

第7章图(下)-数据结构简明教程(第2版)-微课版-李春葆-清华大学出版社



(1)置U的初值等于V(即包含有G中的全部顶点),TE的初
和 最
值为空集(即图T中每一个顶点都构成一个连通分量)。

(2)将图G中的边按权值从小到大的顺序依次选取:若选取


的边未使生成树T形成回路,则加入TE;否则舍弃,直到TE中包

含n-1条边为止。
实现克鲁斯卡尔算法的关键是如何判断选取的边是否与生成树 中已保留的边形成回路?
7.4
建立了两个辅助数组closest和lowcost。
所有顶点分为U和V-U两个顶点集。
U中的顶点i:lowcost[i]=0;

V-U中的顶点j:lowcost[j]>0。




小 生
i
j


U中i:lowcost[i]=0
V-U中j:lowcost[j]>0
7.4
实现普里姆算法(2/3):

通过深度优先遍历产生的生成树称为深度优先生成树。


通过广度优先遍历产生的生成树称为广度优先生成树。






无向图进行遍历时:
7.4
连通图:仅需要从图中任一顶点出发,进行深度优先遍历或广
度优先遍历便可以访问到图中所有顶点,因此连通图的一次遍
历所经过的边的集合及图中所有顶点的集合就构成了该图的一
7.4
为此设置一个辅助数组vset[0..n-1],它用于判定两个顶点之

间是否连通。

数组元素vset[i](初值为i)代表编号为i的顶点所属的连通

子图的编号。

数据结构-第7章图答案

数据结构-第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;

第七章 图

第七章 图
vertex firstin firstout
顶点结点结构
顶点值域 指针域 指针域
tailvex headvex hlink
tlink
info
弧结点结构
弧尾结点 弧头结点 指针域 指针域 弧上信息
A B
C
在十字链表中容易求 得顶点的出度和入度
0 A
0 1

2 0∧∧
1 B 2 C
2 1∧
0 2∧∧
图的遍历方法有两种: 深度优先搜索和广度优先搜索
7.3.1 深度优先搜索
按照深度方向搜索 ,它类似于树的先根遍历。 深度优先算法的基本思想是: (1)从图中某个顶点v0出发,首先访问v0。 (2)找出刚访问过的顶点vi的第一个未被访问 的邻接点,然后访问该顶点。重复此步骤,直 到当前的顶点没有未被访问的邻接点为止。 (3)返回前一个访问过的顶点,找出该顶点的 下一个未被访问的邻接点,访问该顶点。转2。
一、图的数组(邻接矩阵)存储表示 二、图的邻接表存储表示
三、有向图的十字链表存储表示 四、无向图的邻接多重表存储表示
一、图的数组(邻接矩阵)表示法
所谓邻接矩阵(Adjacency Matrix)的存 储结构,就是用一维数组存储图中顶点的信息, 用矩阵表示图中各顶点之间的邻接关系。假设 图G=(V,E)有n个确定的顶点,即V= {v0,v1,…,vn-1},则表示G中各顶点相邻关系为一 个n×n的矩阵
遍 历
DFSTraverse(G, v, Visit());
//从顶点v起深度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。
BFSTraverse(G, v, Visit());
//从顶点v起广度优先遍历图G,并对每 //个顶点调用函数Visit一次且仅一次。

《数据结构》第 7 章 图

《数据结构》第 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> 是不同的。 北京 <北京,上海> (北京,上海) <上海,北京> <北京,上海> 北京 上海 上海

数据结构第七章--图(严蔚敏版)

数据结构第七章--图(严蔚敏版)
9个顶点 个顶点
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章图(Graphs)

第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

数据结构 C语言版(严蔚敏版)第7章 图

数据结构 C语言版(严蔚敏版)第7章 图
data Fout
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章 图4-拓扑排序和关键路径

数据结构:第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网就是一种可以形象地反映出整个工程中各个 活动之间前后关系的有向图。例如,计算机专业学生的 课程开设可看成是一个工程,每一门课程就是工程中的 活动,下页图给出了若干门所开设的课程,其中有些课 程的开设有先后关系,有些则没有先后关系,有先后关 系的课程必须按先后关系开设,如开设数据结构课程之 前必须先学完程序设计基础及离散数学,而开设离散数 学则必须先并行学完数学、程序设计基础课程。

图数据结构C语言版

图数据结构C语言版

7.2 图旳存储构造
for(i=0;i<N->vexnum;i++) /*创建一种数组,用于保存网旳各个顶点*/
scanf("%s",N->vertex[i]);
for(i=0;i<N->vexnum;i++) /*初始化邻接矩阵*/
for(j=0;j<N->vexnum;j++)
{
N->arcs[i][j].adj=INFINITY;
{
VertexType vertex[MAXVERTEX]; /*顶点数组*/
AdjMatrix arcs; /*邻接矩阵,存储边或弧旳信息*/
int vexnum,arcnum; /*顶点数和边(弧)旳数目*/
GraphKind kind; /*图旳类型*/
}MGraph;
7.2 图旳存储构造
【例7.1】 采用邻接矩阵创建一种有向网N,如图7.9所 示。
/*将网旳顶点数置为0*/
N->arcnum=0;
/*将网旳弧旳数目置为0*/
}
7.2 图旳存储构造
7.2.2 邻接表表达法 一种图旳邻接表表达由表头结点表和边表两部分构成。 (1) 表头结点表:表头结点采用顺序存储构造实现,这 么能够随机地访问任意顶点。表头结点由两个域构成:数据 域和指针域。其中,数据域用来存储顶点信息,指针域用来 指向边表中旳第一种结点。 (2) 边表:边表由三个域构成:邻接点域、数据域和指 针域。其中,邻接点域表达与相应旳表头顶点邻接点旳位置 ,数据域存储与边或弧旳信息,指针域用来指示下一种边或 弧旳结点。表头结点与边表结点旳存储构造如图7.11所示。

数据结构第7章习题答案

数据结构第7章习题答案

第7章 《图》习题参考答案一、单选题(每题1分,共16分)( C )1. 在一个图中,所有顶点的度数之和等于图的边数的倍。

A .1/2 B. 1 C. 2 D. 4 (B )2. 在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的倍。

A .1/2 B. 1 C. 2 D. 4 ( B )3. 有8个结点的无向图最多有条边。

A .14 B. 28 C. 56 D. 112 ( C )4. 有8个结点的无向连通图最少有条边。

A .5 B. 6 C. 7 D. 8 ( C )5. 有8个结点的有向完全图有条边。

A .14 B. 28 C. 56 D. 112 (B )6. 用邻接表表示图进行广度优先遍历时,通常是采用来实现算法的。

A .栈 B. 队列 C. 树 D. 图 ( A )7. 用邻接表表示图进行深度优先遍历时,通常是采用来实现算法的。

A .栈 B. 队列 C. 树 D. 图( C )8. 已知图的邻接矩阵,根据算法思想,则从顶点0出发按深度优先遍历的结点序列是( D )9. 已知图的邻接矩阵同上题8,根据算法,则从顶点0出发,按深度优先遍历的结点序列是A . 0 2 4 3 1 5 6 B. 0 1 3 5 6 4 2 C. 0 4 2 3 1 6 5 D. 0 1 23465 ( D )10. 已知图的邻接表如下所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是( A )11. 已知图的邻接表如下所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是A .0 2 4 3 1 5 6B. 0 1 3 6 5 4 2C. 0 1 3 4 2 5 6D. 0 3 6 1 5 4 2⎥⎥⎥⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎢⎢⎢⎣⎡0100011101100001011010110011001000110010011011110A .0 1 3 2 B. 0 2 3 1 C. 0 3 2 1 D. 0 1 2 3A.0 3 2 1 B. 0 1 2 3C. 0 1 3 2D. 0 3 1 2(A)12. 深度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(D)13. 广度优先遍历类似于二叉树的A.先序遍历 B. 中序遍历 C. 后序遍历 D. 层次遍历(A)14. 任何一个无向连通图的最小生成树A.只有一棵 B. 一棵或多棵 C. 一定有多棵 D. 可能不存在(注,生成树不唯一,但最小生成树唯一,即边权之和或树权最小的情况唯一)二、填空题(每空1分,共20分)1. 图有邻接矩阵、邻接表等存储结构,遍历图有深度优先遍历、广度优先遍历等方法。

数据结构第7章图3有向无环图及其应用ppt课件

数据结构第7章图3有向无环图及其应用ppt课件
while (!StackEmpty(S)) { Pop(S,i); printf(i,G.vertices[i].data); ++count; //输出i号顶点并计数
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
typedef enum{DG,DN,UDG,UDN}GraphKind; /*定义顶点数据类型*/
typedef char VertexData; /*定义邻接矩阵中元素值(即边信息)的数据类型*/
typedef int ArcNode; /*定义图的邻接矩阵类型:一个顶点信息的一维数组,一个邻
接矩阵、当前图中包含的顶点数、边数以及图类型(有向图、 有向网、无向图、无向网)*/
输入<A,B>15,<A,C>6,<C,D>8,<D,A>10后,分别建立4 个边结点结点,存储这些边结点信息,然后将这些边结 点插入到相应的表结点链表中。可是关键的问题是如何 根据输入的边结点信息找到正确的链接位置?
利用一个定位函数(类似邻接数组的方法), LocateVertex(G,v)得到顶点v在表头结点数组中的 位置即可。
让我们来分析一下如何正确的使用邻接表存 第储一步一:个初图始。化。在该步骤中给出图的顶点数、边
(弧)数以及表头结点组。 例如对于下图,其初始的状态为:
G.vexnum=4;
G.arcnum=4; 0 A ^
1B ^
2C ^
3D ^
A 15 B
6
10
8
C
D
第二步:输入边结点信息,建立与各个表头结点邻接 的边结点链表。
typedef struct { VertexData vertex[MAX_VERTEX_NUM];
ArcNode arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vertexnum,arcnum; GraphKind kind; } AdjMatrix;//图的邻接矩阵表示类型
int adjvex;//与表头顶点相邻的顶点的坐标值 int info;//存储边的信息,如权值 struct ArcNode *nextarc;//指点下一条边(弧) 的指针
}ArcNode; /*定义表头结点数据类型*/ typedef strcut VertexNode{
char data;
路径与回路,连通图
A
B
A
B
F
C
E
D
A
B
C
A
B
F
C
F
C
E
D
E
D
7.2 图的存储结构
7.2.1 邻接矩阵表示法 图的邻接矩阵表示法既是图的顺序存储表示法,
又称为数组表示法。通常采用两个数组来表示 一个图:一个是用来存储顶点信息的一维数组, 另一个是用来存储顶点之间的相邻关系的二维 数组,该二维数组被称为邻接矩阵。
7.3 图的遍历
7.3.1 深度优先搜索遍历DFS 图的深度优先搜索遍历是指按照深度方向的搜索
(纵向搜索),类似于树的先序遍历。其基本 思想是: (1)从图中某个顶点v0 出发,首先访问v0 。 (2)找出刚访问过的顶点的第一个未被访问过 的邻接点,然后访问该顶点。以该顶点为新顶 点,重复此步骤,直到刚访问的顶点没有未被 访问的邻接点为止。 (3)返回前一个访问过的且仍有未被访问过的 邻接点的顶点,找出该顶点的下一个未被访问 的邻接点,访问该顶点。然后执行步骤(2)。
表头结点结构、边(弧)结点结构及实例图的
表头结点结构
边(弧)结点结构
vexdata
firstarc
A 15
6
10
8 C
adjvex B
D
info nextarc
0A
1B ^
2C 3D
2
6
3 8^ 0 10 ^
1
15 ^
构造图的邻接表 图中的邻接表,都包含一些什么信息呢?
存放顶点信息的结点 数组,其每个结点相 当于单链表的头结点
7.2.2 邻接表表示法
图的邻接表表示法是图的链式存储表示法,比较 适合存储稀疏图。在邻接表中,首先建立一个 表头结点表,该表的作用类似于邻接矩阵中的 顶点数组,表中存储着所有顶点的信息。将该 表中的每个元素作为链表的头结点,对图中的 每个顶点建立一个单链表,该单链表中的结点 就是与此顶点关联的边对应的另一个顶点信息 以及边的信息(比如权值等),因此称这样的 结点为边结点或者弧结点。所以,图的邻接表 表示也是由两部分构成:表头结点表和边链表。
与顶点A相邻的 边结点链表
0A
1B ^
2C 3D
2
6
3 8^ 0 10 ^
1 15 ^
A 15 B
6
10
8
C
D
邻接表存储结构
/*定义最多顶点个数*/ #defined MAX_VERTEX_NUM 20 /*枚举图的种类*/ typedef enum{DG,DN,UDG,UDN}GraghKind; /*边结点类型*/ typedef struct ArcNode{
/*定义图的邻接表的基本状态信息*/
typedef struct
{ /*存放图的顶点信息的表头结点数
组*/
VertexNode vertex[MAX_VERTEX_NODE];
/*具体图的顶点数和边(弧)数*/
int v }AdjList;//定义一个基于邻接表的图 类型
不同的图以及它们的邻接矩阵
A
B
F
C
E
D
无向图G1
A
B
F
C
E
D
有向图G2
不同的图以及它们的邻接矩阵
A
15
B
10
11
F
C
20
3
4
E
6
D
无向网G1
A
15
B
10 F
11 C
20
3
4
E
6
D
有向网G2
邻接矩阵表示法C语言描述
#define MAX_VERTEX_NUM 20/*定义最多顶点个数*/ #define INFINITY 32768/*定义无穷大*/ /*描述图的类型,用枚举型类型来说明*/
与用边如数下的的方关式系描为述::
G1={V,E}
Ve=={A( ,B,C,D,E,)F/}2
G2={V,E} V={A,B,C,D,E,F}
E对 顶=,({(E(于点B,AF,,D有 的)B})),向 出,((CA图 度,,EC), 之),,((D所 和A,,E有F)),顶点的E=,<入{<F<,BBE度,,>DA}之>>,,<和<EC,等,CA>于>,,(<E所A,D,有F>>,
数据结构第7章 图
子图
A
B
F
C
E
D
无向图G1
A
C
F
E
G1的子图H1
A
B
F
C
E
D
有向图G2
A
B
F
C
E
D
G2的子图H2
邻接点,度、入度和出度
3A
2
相邻 B
2F
2C
(1,1) F
(2,1) A
(0,2) B
(1,1) C
(2,0)
3E
2 D
(1,2) E
D
而对于有向图G2,
对若于图无中向有图nG个1,顶通点常,采e条边或也弧有,类则似图的中描的述度
相关文档
最新文档