数据结构笔记5:图

目录

图的基本概念

题目

图的存储结构:

题目

图的遍历

题目

图的应用

最小生成树

Prim算法

Kruskal算法

最短路径

Dijkstra

Floyd

拓补排序

关键路径

题目


图的基本概念

题目

CSDN新版编辑器真见鬼,这回没加编号,结果项目符号都被转成错的编号了,连图片也粘不上,我等明天有空重新来粘

  1. 2009年计算机联考真题)下列关于无向连通图特性的叙述中,正确的是I
    I所有顶点的度之和为偶数
    边数大于顶点个数减1
    至少有一个顶点的度为1
    I:若图G中任意两个顶点都是连通的(不一定直接相连,可经过中间结点),则称图G为连通图。对于任何一条边来说,连接两个顶点,总度为2。若有n条边,则度之和为2

Ⅱ:树是连通的,=顶点-1

Ⅲ:回路所有点度>=2

  1. 以下关于图的叙述中,正确的是(C
    A.强连通有向图的任何顶点到其他所有顶点都有弧
    B.图的任意顶点的入度等于出度
    C.有向完全图一定是强连通有向图
    D.有向图的边集的子集和顶点集的子集可构成原有向图的子图

A:强连通有向图: 在有向图中,若从顶点x到顶点y和从顶点y到顶点x之间都有路径(路径可以不直接相连,经过中间结点),则称这两个顶点是强连通的。

C有向完全图任何顶点到其他所有顶点都有弧

  1. 对于一个有n个顶点的图:如果是连通无向图,其边的个数至少为()如果是强连通有向图,其边的个数至少为()A
    A. n-1,n
    D.n,n(n-1)

连通无向图:树形结构

强连通有向图:环

  1. 无向图G23条边,度为4的顶点有5,度为3的顶点有4,其余都是度为2的顶点,则图G最多有()个顶点D
    A.11
    D.16

一条边产生2个度,具有e条边的无向图中,有总度数∑TD(Vi)=2e

这一部分的计算题主要抓住边与度数(顶点)关系

图的存储结构:

题目

  1. 关于图的存储结构,()是错误的
    A.使用邻接矩阵存储一个图时,在不考虑压缩存储的情况下,所占用的存储空间大小只与图中的顶点数有关,与边数无关
    B.邻接表只用于有向图的存储,邻接矩阵适用于有向图和无向图
    C.个有向图的邻接矩阵,对角线以下元紊为0,则该图的拓扑序列必定存在
    D.存储无向图的邻接矩阵是对称的,故只需存储邻接矩阵的下(或上)三角部分即可

An个顶点的图,邻接矩阵不压缩,存储空间大小为o(n2)
C:由于邻接矩阵中对角线以下的元素全为0,若存在<i,j>,则必i<j,由传递性可知图中路径的顶点编号是依次递增的,假设存在环k->…->j->k,k<j<k矛盾,不存在环(拓补序列存在的条件)

  1. (2015年计算机联考真题)已知含有5个顶点的图G如下图所示
    1)写出图G的邻接矩阵A(行、列下标从0开始)
    2)A2,矩阵A2中位于03列元素值的含义是什么?
    3)若已知具有n(n2)个顶点的图的邻接矩阵为B,Bm(2≤m≤n)中非零元素的含义是什么?

Bm(2≤msn)中位于ij(0i,jn-1)的非零元素的含义是:图中从顶点i到顶点j长度为m的路径条数

A2 为长度为2的路径条数:0-2-30-1-30-4-3

图的遍历

题目

  1. 设无向图G=(V,E)G'=(V',E'),如果G'G的生成树,则下列说法中错误的是()B
    A.G'G的子图
    B.G'G的连通分量
    C.G'G的极小连通子图且V=V'
    D.G'G的一个无环子图

连通分量中包含连通子图的所有边

  1. 分别采用基于深度优先遍历和广度优先遍历算法判别以邻接表方式存储的有向图中是否存在由顶点vi到顶点νj的路径(ij)注意,算法中涉及的图的基本操作必须在此存储结构上实现。

1.深度搜索

2.广度搜索(层次)

  1. 写出图的深度优先搜索DFS的非递归算法(图采用邻接表形式)

在深度优先搜索的非递归算法中使用了一个栈S,记忆下一步可能访问的顶点,同时使用了一个访问标记数组 visited[i], visited[i]中记忆第个顶点是否在栈内或曾经在栈内。若是,以后它不能再进栈。

  1. 试设计一个算法,判断一个无向图G是否为一棵树。若是一棵树,则算法返回true,否则返回false

采用深度优先搜索算法在遍历图的过程中统计可能访问到的顶点个数和边的条数,如果一次遍历就能访问到n个顶点和n-1条边,则可断定此图是一棵树。

图的应用

最小生成树

Prim算法

选择最小权值的边,其中一个顶点在结果集中,另一个在结果集外(不回路)

初始化:向空的结果树T=(VT,ET)中添加图G=NE)的任顶点u0,使VT={u0},ET为空集;

循环(直到VT=V):从图G中选择满足{(u,v)|uVT,vV-VT}且具有最小权值的边(u,v),并置VT=VT{v}, ET=ET{(u,v)}

时间复杂度O(|V|2)适合稠密图,边再多也不妨碍时间效率

Kruskal算法

初始时结果集就包含所有顶点
初始化: VT=V,ET=空集。即是每个顶点构成一棵独立的树,T是一个仅含|V|个顶点的森林;循环(直到T为树),按图G的边的权值递增的顺序依次从E- ET中选择1条边,若这条边加入后不构成回路,则将其加入ET,否则舍弃

用堆排序或并查集挑选边

通过并查集找根是否相同,判断是否属于同一个连通分量

传入参数为Edges数组,使用堆排序对边排序,parent为并查集

ab分别为这条边的两个端点,a_root!=b_root代表两条边属于不同的连通分量,可以加入(奇怪,加入的不是a,b而是root)

时间复杂度O(|E|log|E|),其中外层for循环为O(|e|),堆排序O(|E|log|E|)

时间复杂度只与边相关,适合稀疏图

最短路径

Dijkstra

带权图单源(一个起始点)最短路径

辅助数组

s[]:标记已经计算完成的顶点。

初始化:数组中的值全部初始化为0。源点下标的值初始化为1。

distn :记录从源点v0到其他各顶点当前的最短路径长度。

数组中的值初始化为源点到各个顶点边的权值,即dist[i]=arcs[0][i];。

path[]:记录从最短路径中顶点的前驱顶点,即path[i]为v到vi最短路径上vi

的前驱顶点。

数组中的值初始化:

若源点v0到该顶点vi有一有向边(无向边),则另path[i]=0;

否则path[i]=-1;

算法

1)初始化数组,并集合S初始为{0};

2)从顶点集合V-S中选出vj满足dist[j]=Min{dist[i]| vj∈V-S},

vj就是当前求得的最短醃径的终点,并另S∪{j};

3)修改此时从v0出发到集合V-S上任一顶点vk最短路径的长度:

若 dist[j]+arcs[j][k]<dist[k]

则令 dis[k]=distfj]+arcs[j][k];      path[k]=j;

4)重复2)、3)操作n-1次,直到S中包含全部顶点;

初始化

挑选最小值并保存其顶点下标

判断未被标记,且为最小

时间复杂度O(|V|2)

不适合负权边

Floyd

求出每一对顶点之间的最短路径

(啊我的脚标格式也被清空了,早知道还不如粘图片)

递推产生一个n阶方阵序列A-1~An-1

A(k)[i][j]:顶点vi到vj最短路径长度,且该路径经过的顶点编号不大于k

原理:动态规划

#初始:不允许在其他顶点中转,最短路径是? A-1[i][j]=arcs[i][j]

#递推:k:若允许在 V0、V1、V2 …… Vk 中转,最短路径是?A(k)[i][j] = Min{ A(k-1) [i][j], A(k-1)[i][k]+ A(k-1)[k][j]},k=0,1,…,n-1

每加入一个顶点,对矩阵中每一个值修改(共三重循环)

时间复杂度O(|V|3)

拓补排序

有向无环图简称DAG图。

AOV网若用一个DAG图表示一个工程,其顶点表示活动,用有向边< vi, vj >表示活动vi先于活动vj进行的传递关系,则将这种DAG称为顶点表示活动网络,记为AOV网。

拓补排序对DAG所有顶点的一种排序,使若存在一条从顶点A到顶点B的路径,在排序中B排在A的后面。

算法思想

1)    从DAG图中选择一个没有前驱的顶点并输出(入度=0)

2)    从图中删除该顶点和所有以它为起点的有向边

3)    重复1)、2)直到当前的DAG图为空或当前图中不存在无前驱的顶点为止。后一种情况说明图中有环。

拓补排序结果不唯一

入度为0的顶点不唯一,需要用栈保存

入度为0的顶点入栈,每出栈一个,遍历边表找到顶点修改入度

要访问每个顶点,对其边表修改,时间复杂度:时间复杂度O(|V|+|E|)

若邻接矩阵为三角矩阵,则存在拓扑排序;反之不一定成立。

关键路径

AOE (Activity On Edge NetWork)在带权有向图中,以顶点表示事件,以有向边表示活动,以边上的权值表示完成该活动的开销(如 完成活动所需的时间)

从源点到汇点的有向路径可能有多条,所有路径中,具有最⼤路径⻓度的路径称为关键路径,⽽把关键路径上的活动称为关键活动

事件vk的最早发时间ve(k)——决定了所有从vk开始的活动能够开⼯的最早时间

ve(源点) = 0

ve(k) = Max{ve(j) + Weight(vj, vk)}, vj为vk 的任意前驱

最迟发时间 vl( )

按逆拓扑排序序列,依次求各个顶点的 vl(k):

 vl(汇点) = ve(汇点)

vl(k) = Min{vl(j) - Weight(vk, vj)} , vj为vk的任意后继

活动ai的最早开始时间e(i)——指该活动弧的起点所表⽰的事件的最早发⽣时间

若边表⽰活动ai,则有e(i) = ve(k)

活动的最迟发时间 l( )

若边表⽰活动ai,则有l(i) = vl(j) - Weight(vk, vj)

有活动的时间余量 d( )

d(i) = l(i) - e(i)

题目

  1. (2012真题)下列关于最小生成树的叙述中,正确的是()
    I.最小生成树的代价唯一
    .所有权值最小的边一定会出现在所有的最小生成树中
    .使用普里姆(Prim)算法从不同顶点开始得到的最小生成树一定相同
    .使用普里姆算法和克鲁斯卡尔( Kruskal)算法得到的最小生成树总不相同
    最小生成树的树形可能不唯一(这是因为可能存在权值相同的边),但是代价一定是唯一的,I正确
    权值最小的边有多条并且构成环状,错误
    N个结点构成环,N-1条边权值相等,从不同的顶点开始prim算法会得到N-1种不同的最小生成树,错误。
    当最小生成树唯一时(各边的权值不同),错误。
  2. (2016真题)若将n个顶点e条弧的有向图采用邻接表存储,则拓扑排序算法的时间复杂度是?O(n+e)
    釆用邻接表作为AOV网的存储结构进行拓扑排序,需要对n个顶点做进栈、出栈、输出各一次,在处理e条边,需要检测这n个顶点的边链表的e个边结点,总共需要的时间代价为o(n+e)

若采用邻接矩存储AOV网拓扑排序,e条边需要对每一个顶点检测相应矩阵中的某一行,寻找与它相关联的边以便对这些边的入度减1,需要的时间代价为o(n2)

  1. (2017真题)使用Pim(普里姆)算法求带权连通图的最小(代价)生成树(MST)。请回答下列问题
    1)对下列图G,从顶点A开始求GMST,依次给出按算法选出的边。
    2)GMST是唯一的吗?
    3)对任意的带权连通图,满足什么条件时,MST是唯一的?

1)Prim算法从一个任意的顶点开始,每一步在连接树集合S中顶点和其他顶点的边
,选择一条使得树的总权重增加最小的边加入集合S。当算法终止时,S就是最小
生成树。

①s中顶点为A,候选边为(A,D)(A,B)(A,E),选择(A,D)加入S
②s中顶点为AD,候选边为(A,B)(A,E)(D,E)(C,D),选择(D,E),加入S
③s中顶点为ADE,候选边为(A,B)(C,D)(C,E),选择(C,E)加入S
④s中顶点为ADEC,候选边为(A,B)(B,C),选择(B,C)加入S

2)GMST是唯一的。第一小题的最小生成树包括了图中权值最小的四条边,其他边都比这四条边大,所以此图的MST唯一

3)当带权连通图所有边的权值均不相同时,MST是唯一的。此题不要求回答充分
必要条件,所以回答一个限制边权值的充分条件即可

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值