高等教育济南大学数据结构 第七章Word下载.docx
- 文档编号:20546127
- 上传时间:2023-01-23
- 格式:DOCX
- 页数:37
- 大小:925.79KB
高等教育济南大学数据结构 第七章Word下载.docx
《高等教育济南大学数据结构 第七章Word下载.docx》由会员分享,可在线阅读,更多相关《高等教育济南大学数据结构 第七章Word下载.docx(37页珍藏版)》请在冰豆网上搜索。
带权的无向图称为无向网。
带权的有向图称为有向网。
性质:
若用n表示图中顶点数目,用e表示边或弧的数目,若在图中不存在顶点到自身的边或弧,则
对于有向图,0≤e≤n(n-1)
对于无向图,0≤e≤1/2
n(n-1)
证明:
0≤e显然成立
对有向图来说,每个顶点至多可发出n-1条弧,共n个顶点,故至多有n(n-1)条弧,即e≤n(n-1);
对无向图来说,由于边无方向,则任一两个顶点v1和v2,都有(v1,v2)=(v2,v1),故至多有n(n-1)条边;
完全图、有向完全图、稀疏图、稠密图
有1/2n(n-1)条边的无向图称为完全图。
有n(n-1)条弧的有向图称为有向完全图。
有很少条边或弧的图称为稀疏图。
反之称为稠密图。
子图
假设有两个图G=(V,E)和G’=(V’,E’),如果V’V,且E’E,则称G’为G的子图。
邻接与关联
对于无向图G=(V,E),如果存在边(v,v’),则称顶点v和v’互为邻接点,即v和v’相邻接。
称边(v,v’)与顶点v和v’相关联。
对于有向图G=(V,E),如果存在弧<
v,v’>
,则称顶点v邻接到顶点v’,顶点v’邻接自顶点v。
称弧<
和顶点v,v’相关联。
顶点的度
对于无向图,顶点v的度是和v相关联的边的数目,记做TD(v)。
顶点v3的度为
对于有向图,顶点v的度TD(V)分为两部分——出度、入度。
以顶点v为头的弧的数目称为v的入度,记为ID(v);
以顶点v为尾的弧的数目称为v的出度,记为OD(v);
顶点v的度为TD(v)=ID(v)+OD(v)。
顶点v1的出度为2
顶点v1的入度为1
顶点v1的度为3
对于一个图(无向图、有向图),如果顶点vi的度为TD(vi),那么具有n个顶点、e条边或弧的图,必满足如下关系
无向图、有向图的边或弧均计算两遍。
路径、回路(环)、链、简单路径、简单回路
无向图G中若存在一条有穷非空序列w=v0e1v1e2v2ekvk,其中vi和ei分别为顶点和边,则称w是从顶点v0到vk的一条路径。
顶点v0和vk分别称为路径w的起点和终点。
路径的长度是路径上的边的数目。
w的长度为k
起点和终点相同的路径称为回路(环)。
若路径w的边e1,e2,…,ek互不相同,则称w为链。
若路径w的顶点v0,v1,。
。
vk互不相同,则称w为简单路径。
链是否为简单路径?
不一定
简单路径是否为链?
一定
起点和终点相同的简单路径称为简单回路(简单环)。
有向图G中若存在一条有穷非空序列w=v0e1v1e2v2ekvk,其中vi和ei分别为顶点和弧,则称w是从顶点v0到vk的一条路径。
链
简单路径
回路
简单回路
连通、连通图、连通分量、强连通图、强连通分量
无向图G,如果从顶点v到顶点v’有路径,则称v和v’是连通的。
如果对于无向图G中任意两个顶点vi,vj∈V,vi和vj都是连通的,则称G是连通图。
连通分量指的是无向图中的极大连通子图。
有向图G,如果从顶点v到顶点v’有路径或从顶点v’到顶点v有路径,则称v和v’是连通的。
在有向图G中,如果对于每一对vi,vj∈V,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。
有向图中的极大强连通子图称作有向图的强连通分量。
生成树、生成森林——对无向图而言
一个连通图G的一个包含所有顶点的极小连通子图T是
(1)T包含G的所有顶点n个
(2)T为连通子图
(3)T包含的边数最少
T是一棵有n个顶点,n-1条边的生成树。
一个有n个顶点的连通图的生成树有且仅有n-1条边。
1.如果一棵生成树有n个顶点和小于n-1条边,则为非连通图。
构成一棵n顶点生成树需要n-1条边,
少于n-1,则必有边断开,不再连通。
2.如果一棵生成树有n个顶点和多于n-1条边,则一定有环。
若再添加一条边,必会使得与它关联的那两个顶点之间有了第二条路经。
一个连通图的生成树并不唯一
删除环中的任一条边
非连通图的各连通分量的生成树构成了非连通图的生成森林。
7.2图的存储结构
顺序存储
邻接矩阵
链式存储
邻接表
邻接多重表
十字链表
7.2.1邻接矩阵
设图G=(V,E)具有n(n≥1)个顶点v1,v2,。
vn和m条边或弧e1,e2,…,em,则G的邻接矩阵是n×
n阶矩阵,记为A(G)。
邻接矩阵存放n个顶点信息和n2条边或弧信息。
其每一个元素aij定义为:
aij=
0顶点vi与vj不相邻接
1顶点vi与vj相邻接
例,有向图G
例,无向图G
邻接矩阵数据类型定义
intAdjMatrix[Vertex_NUM][Vertex_NUM];
优点:
1.容易判断任意两个顶点之间是否有边或弧。
2.容易求取各个顶点的度。
例无向图G
无向图,顶点vi的度是邻接矩阵中第i行或第i列的元素之和。
例G1中,v1的度为2,v2的度为3。
有向图,顶点vi的出度是邻接矩阵中第i行的元素之和。
顶点vi的入度是邻接矩阵中第i列的元素之和。
例v1的度为2+1=3。
无向图的邻接矩阵都是对称矩阵。
有向图的邻接矩阵一般不对称。
带权图(网)的邻接矩阵
wij顶点vi与vj相邻接
∞顶点vi与vj不相邻接
7.2.2邻接表
对图中每一个顶点建立一个单链表,指示与该顶点邻接的顶点和关联的边或出弧。
vexinfo:
顶点的信息adjvex:
邻接顶点位置
firstarc:
第一条关联边结点arcinfo:
边的信息
nextarc:
下一条关联边结点
邻接表数据类型定义
typedefstructArcNode{
intadjvex;
ArcInfodata;
structArcNode*nextarc;
}ArcNode;
typedefstructVNode{
VertexInfodata;
ArcNode*firstarc;
}Vnode,AdjList[Vertex_Num];
无向图G
如何获取顶点的度?
顶点vi的度为第i条链中的结点数。
需要多少存储空间?
(设n个顶点,e条边)
n+2e
有向图G
顶点vi的出度为邻接表第i条链中的结点数。
顶点vi的入度为逆邻接表第i条链中的结点数。
2n+2e
为了方便求顶点的入度,引入逆邻接表
邻接矩阵与邻接表
存储空间
求顶点的度
判断两个顶点是否关联
7.3图的遍历
与树的遍历类似,如果从图中某一顶点出发访遍图中所有顶点,且使每一个顶点仅被访问一次,这一过程称为图的遍历。
图的遍历算法是求解图的连通性问题、生成树、和拓扑排序等算法的基础。
通常有两条遍历图的路径:
深度优先搜索、广度优先搜索。
7.3.1深度优先搜索
图可分为三部分:
基结点
第一个邻接结点所能导出的子图
其它邻接顶点所能导出的子图
深度优先搜索是类似于树的先序遍历的一种方法。
过程分析
深度优先搜索顺序:
v1v2v4v8v5v3v6v7
栈实现深度优先搜索
v1v2v4v8v5v3v6v7
voidDFSTraverse(GraphG,intv){
initstack(S);
所有顶点visited函数置为false;
Push(S,v);
visited[v]=TRUE;
printf(v);
while(!
StackEmpty(S)){
L:
Gettop(S,v);
//获取栈顶元素
for(w=FirstAdjVex(G,v);
w>
=0;
w=NextAdjVex(G,v,w))
if(!
visited[w]){
Push(S,w);
visited[w]=TRUE;
printf(w);
GotoL;
}//访问栈顶元素的全部邻接顶点
Pop(S);
}
7.3.2广度优先搜索
把图人为的分层,
按层遍历。
广度优先搜索类似于树的层次遍历,
广度优先搜索顺序:
v1,v2,v3,v4,v5,v6,v7,v8
队列实现广度优先搜索算法
voidBFSTraverse(GraphG,intv){
//visited[0..n-1]初始均为0;
v指示顶点在数组中的位置;
InitQueue(Q);
EnQueue(Q,v);
visited[v]=TRUE;
QueueEmpty(Q)){
DeQueue(Q,u);
for(w=FirstAdjVex(G,u);
w=NextAdjVex(G,u,w))
visited[w]){
EnQueue(Q,w);
//其邻接顶点全部送入队列
书面作业:
分别应用DFS,BFS实现遍历要求尽量按顶点序号顺序搜索
7.4图的连通性问题
7.4.1无向图的连通分量
利用DFS或BFS获取连通分量
7.4.2无向图的生成树
利用DFS或BFS获取生成树
例,DFS
例,BFS
7.4.3最小生成树
一个无向图可以对应多个生成树。
一个带权无向图(无向网)同样可以对应多个生成树。
一棵生成树的代价定义为树上各边的权之总和。
代价最小的生成树称为最小生成树。
实际价值?
如何求取最小生成树?
引论:
假设N=(V,E)是一个连通网,U是顶点集V的非空子集,若(u,v)是一条具有最小权值的边,其中u∈U,v∈V-U,则必存在一棵包含边(u,v)的最小生成树。
假设连通网N的任何一棵最小生成树都不包含边(u,v);
设T是N的一棵最小生成树,当把边(u,v)加入到T中时,T中必存在一条包含(u,v)的回路;
删去边(u’,v’),可得到另一棵生成树T’;
由于边(u,v)的代价最小,则T’的代价不高于T的代价,即T’是一棵包含边(u,v)的最小生成树。
矛盾。
Prim算法
思想:
N=(V,E)是具有n个顶点的连通网,设U是最小生成树中顶点的集合,设TE是最小生成树中边的集合;
初始,U={u1},TE={},
重复执行:
在所有u∈U,v∈V-U的边(u,v)中寻找代价最小的边(u’,v’),并纳入集合TE中;
同时将v’纳入集合U中;
直至U=V为止。
集合TE中必有n-1条边。
例,
初始:
U={v1},V-U={v2,v3,v4,v5,v6}TE={}
U={v1,v3},V-U={v2,v4,v5,v6}<
U={v1,v3,v6},V-U={v2,v4,v5}<
v3,v6>
U={v1,v3,v4,v6},V-U={v2,v5}<
v6,v4>
U={v1,v2,v3,v4,v6},V-U={v5}<
v3,v2>
U={v1,v2,v3,v4,v5,v6},V-U={}<
v2,v5>
重点:
边一定存在于U与V-U之间。
Kruskal算法
N=(V,E)是n顶点的连通网,设E是连通网中边的集合;
构造最小生成树N’=(V,TE),TE是最小生成树中边的集合,初始TE={};
选取E中未访问过的权值最小的边(u,v),
判断边(u,v)与TE中的边是否构成回路?
否,将边(u,v)纳入TE中,并从E中删除边(u,v);
直至E为空;
当前权值最小边(v5,v6)
初始TE={}
v4,v6>
v2,v3>
作业.构造最小生成树要求:
写中间过程
7.5最短路径
旅客希望停靠站越少越好,则应选择
济南——北京——太原——兰州
旅客考虑的是路程越短越好,则应选择
济南——徐州——郑州——西安——兰州
带权图的最短路径计算问题
通常在实际中,航运、铁路、船行都具有方向性,故我们以带权有向图为例介绍最短路径算法。
Ø
从单个源点到其余各顶点的最短路径算法。
任一对顶点之间的最短路径算法。
7.5.1从单个源点到其余各顶点的最短路径算法——Dijkstra算法
思想:
利用已得到的顶点的最短路径来计算其它顶点的最短路径。
贪心思想:
利用局部最优来计算全局最优。
求从v0到其余各顶点的最短路径。
D[i]表示v0到vi的最短路径的长度
Path[i]表示v0到vi的最短路径上的顶点
1.初始,D[i]的值为v0到vi的弧的权值
显然,D[i]中的最小值D[2]便是v0到v2的最短路径的长度,Path[2]=(v0,v2)
v0v1v2v3v4v5
D[i]∞10∞30100
例
2.如何寻找下一条最短路径?
设下一条最短路径的终点是vj,则这条最短路径或者是(v0,vj)、或者是v0经过v2到达vj的路径;
其中取D[i](D[2]除外)中的最小值得到v4,Path[4]=(v0,v4)。
D[i]∞106030100
3.如何寻找下一条最短路径?
贪心思想并不是万能的!
货郎担问题
贪心思想v0,v1,v2,v3110
最优解v0,v1,v2,v350
7.5.2每一对顶点之间的最短路径算法——Floyd算法
算法1:
每次以一个顶点为源头,重复执行Dijkstra算法n遍,便可得到每一对顶点之间的最短路径。
算法时间复杂度:
O(n3)
算法2:
Floyd算法
Floyd算法思想
初始,从图的带权邻接矩阵D(-1)出发,作为顶点vi到vj的最短路径。
0.考虑经过v0是否会存在更短的路径,即(vi,v0,vj)是否存在(判断弧(vi,v0)和(v0,vj)是否存在);
若存在,比较(vi,vj)与(vi,v0)+(v0,vj),小者作为从vi到vj且中间顶点只经过v0的最短路径,得新矩阵D(0)。
D(-1)D(0)
1.考虑经过v1是否会存在更短的路径,即(viv1vj)是否存在(如果(viv1)和(v1vj)分别是当前找到的中间顶点只经过v0的最短路径);
若存在,比较(vivj)与(viv1)+(v1vj)(D(0)),小者作为从vi到vj的中间顶点经过v0、v1的最短路径,得新矩阵D
(1)。
k.考虑经过vk是否会存在更短的路径,即(vivkvj)是否存在(如果(vivk)和(vkvj)分别是当前找到的中间顶点经过v0、v1…vk-1的最短路径);
若存在,比较(vivj)与(vivk)+(vkvj)(D(k-1)),小者作为从vi到vj的中间顶点经过v0、v1…vk的最短路径,得新矩阵D(k)。
算法描述
定义一个n阶方阵序列:
D(-1),D(0),D
(1),…,D(k),…,D(n-1)
D(k)[i][j]表示从vi到vj的中间顶点经过v0、v1…vk的最短路径的长度。
初始,D(-1)[i][j]=arcs[i][j];
循环n遍,依次考虑将v0,v1,…,vn-1加入到路径中
D(k)[i][j]=Min{D(k-1)[i][j],D(k-1)[i][k]+D(k-1)[k][j]}
D
(2)[i][j]=Min{D
(1)[i][j],D
(1)[i][2]+D
(1)[2][j]}
计算时不用考虑对角线
计算时不用考虑第k行和第k列
作业.求A到其它各点的最短路径及长度要求:
中间过程
作业.求所有顶点对之间的最短路径及长度要求:
7.6有向无环图及应用
一个无环的有向图称为有向无环图,简称DAG图。
给定一个图,如何判断是否存在环?
方法1利用深度优先搜索算法,若将要指向的顶点已被访问过,则存在环。
方法2——拓扑排序法
这种用顶点表示活动,用弧表示活动之间的先后关系的有向无环图称为顶点表示活动的网——AOV网。
对AOV网中的所有顶点进行一个排序,
如果满足:
若i是j的前驱顶点,则结点i必排在结点j之前
则称这样的排序为拓扑排序。
拓扑排序可以为:
C1C2C3C5C4C6
C4C1C2C3C5C6
表示课程之间先后关系的AOV网
若AOV网中的所有顶点都在它的拓扑排序中,则该AOV网中必定不存在环;
否则必存在环。
1.在有向图中选取一个没有前驱的顶点并打印;
2.从图中删除该顶点及所有以此顶点为尾的弧;
3.重复上述两步,直至全部顶点均已打印或者图中剩余顶点均存在前驱为止。
拓扑排序v1v3v2
存在环
7.6.2关键路径
有向无环图也可作为描述工程管理的有效工具。
顶点表示事件(状态)
弧表示活动
每个事件表示在它之前的活动已经完成,在它之后的活动可以开始
为弧加权,通常表示活动所需要的时间
这种顶点表示事件、边表示活动的带权有向无环图称为AOE网
通常,AOE网中只有一个入度为0的顶点(源点),一个出度为0的顶点(汇点)。
对于一个AOE网,最关心的两个问题:
1.完成整项工程最少需要多少时间?
2.哪些活动是影响工程进度的关键?
完成工程的最短时间是从源点到汇点的最长路径的长度,这里的最长路径叫做关键路径。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高等教育济南大学数据结构 第七章 高等教育 济南 大学 数据结构 第七