-
N个结点的连通图的边数问题
2015-09-05 11:13:08在数据结构中,N个顶点的连通图至少要有(N-1)条边(也就是树)才能保证图为连通图. 对于简单图而言至多有n*(n-1)/2条边,此时即是完全图. 强连通图最多n(n-1)条边,最少n-1条边. 强连通图:任意两个顶点都相互...RT:
在数据结构中,N个顶点的连通图至少要有(N-1)条边(也就是树)才能保证图为连通图.
对于简单图而言至多有n*(n-1)/2条边,此时即是完全图.强连通图最多n(n-1)条边,最少n-1条边.
强连通图:任意两个顶点都相互连通的图。
e.g.: 15年腾讯软测的一道选择题
-
n阶完全图边和顶点关系。_【数据结构】有向完全图和强连通图的区别?
2021-01-30 00:41:43我们都是时间旅行者为了寻找生命中的光终其一生行走在漫长的旅途上安迪·安德鲁斯相邻关系:两个顶点之间存在一条边,则表示两个顶点具有相邻关系路径:相邻顶点序偶所构成的序列路径长度:路径上边的数目回路:若一...我们都是时间旅行者
为了寻找生命中的光
终其一生
行走在漫长的旅途上
安迪·安德鲁斯
相邻关系:两个顶点之间存在一条边,则表示两个顶点具有相邻关系路径:相邻顶点序偶所构成的序列路径长度:路径上边的数目回路:若一条路径中第一个顶点和最后一个顶点相同,则为回路连通:从顶点Vi到顶点Vj有路径,则称Vi和Vj连通连通图和连通分量是针对无向图的强连通图和强连通分量是针对有向图的
由概念感觉两者像是形式不同但意思一样,但不一样的说法.
任意两个不同顶点之间都存在方向相反的两条弧.看概念:
如果图中任意两个顶点之间都连通,则称该图为连通图。
连通:
从顶点Vi到顶点Vj有路径,则称Vi和Vj连通路径:相邻顶点序偶所构成的序列
其实最大的疑惑是路径是相邻顶点
其实可看出,连通是两个顶点连通就可以,也就是说,连通图是说两个顶点连通,不一定非要是相邻的两个顶点。
一个无向图G= (V,E)是连通的,那么边的数目大于等于顶点的数目减一
有向完全图和强连通图的区别?
有向完全图一定是强连通的,但强连通不一定是有向完全图。
看概念:强连通图(Strongly Connected Graph)是指在有向图G中,如果对于每一对vi、vj,vi≠vj,从vi到vj和从vj到vi都存在路径,则称G是强连通图。有向图中的极大强连通子图称做有向图的强连通分量。
有向完全图:具有n(n-1)条边的有向图称为有向完全图
有n个顶点的强连通图最多有n(n-1)条边,最少有n条边
证明:(1)最多的情况:即n个顶点中两两相连,若不计方向,n个点两两相连有n(n-1)/2条边,而由于强连通图是有向图,故每条边有两个方向,n(n-1)/2×2=n(n-1),故有n个顶点的强连通图最多有n(n-1)条边。
(2)最少的情况:即n个顶点围成一个圈,且圈上各边方向一致,即均为顺时针或者逆时针,此时有n条边。
下面举例说明:如图1所示,设ABCD四个点构成强连通图,则:
(1)边数最多有4×3=12条
(2)边数最少有4条即:一个有向图是强连通的,当且仅当G中有一个回路,它至少包含每个节点一次图:由结点的有穷集合V和边的集合E组成。
图的结点称为顶点,边是顶点的有序偶对。
简单路径:序列中顶点不重复出现的路径称为简单路径
网:边上带权的图称为带权图,也称为网
无法在扩充顶点的连通子图称为极大连通子图
一个图中的极大连通子图:从一个顶点开始作为子图,逐个添加和这个子图有边相连的顶点,直到所有相连顶点都被纳入其中,所生成的子图就是一个极大连通子图。图有多种存储方式,但一般用到的是邻接矩阵(顺序存储)和邻接表(链式存储)。邻接表:由单链表的表头形成的顶点表和单链表其余结点形成的边表两部分组成邻接多重表中,所有的依附于同一顶点的边串联在同一链表中,由于每条边依附于两个顶点,因此每个边结点同时链接在两个链表中。对无向图而言,其邻接多重表和邻接链表的差别仅仅在于,同一条边在邻接表中用两个结点表示,而在邻接多重表中只有一个结点。
每一个独立而丰富的灵魂,
都有处可栖。
工具人点在看 -
如果求一个连通图中以某个顶点为根_普里姆算法(Prim算法)求最小生成树
2021-01-27 04:00:13通过前面的学习,对于含有 n 个顶点的连通图来说可能包含有多种生成树,例如图 1 所示:图 1 连通图的生成树图 1 中的连通图和它相对应的生成树,可以用于解决实际生活中的问题:假设A、B、C 和 D 为 4 座城市,为了...通过前面的学习,对于含有 n 个顶点的连通图来说可能包含有多种生成树,例如图 1 所示:
图 1 连通图的生成树
图 1 中的连通图和它相对应的生成树,可以用于解决实际生活中的问题:假设A、B、C 和 D 为 4 座城市,为了方便生产生活,要为这 4 座城市建立通信。对于 4 个城市来讲,本着节约经费的原则,只需要建立 3 个通信线路即可,就如图 1(b)中的任意一种方式。在具体选择采用(b)中哪一种方式时,需要综合考虑城市之间间隔的距离,建设通信线路的难度等各种因素,将这些因素综合起来用一个数值表示,当作这条线路的权值。
图 2 无向网
假设通过综合分析,城市之间的权值如图 2(a)所示,对于(b)的方案中,选择权值总和为 7 的两种方案最节约经费。这就是本节要讨论的最小生成树的问题,简单得理解就是给定一个带有权值的连通图(连通网),如何从众多的生成树中筛选出权值总和最小的生成树,即为该图的最小生成树。给定一个连通网,求最小生成树的方法有:普里姆(Prim)算法和克鲁斯卡尔(Kruskal)算法。
普里姆算法
普里姆算法在找最小生成树时,将顶点分为两类,一类是在查找的过程中已经包含在树中的(假设为 A 类),剩下的是另一类(假设为 B 类)。对于给定的连通网,起始状态全部顶点都归为 B 类。在找最小生成树时,选定任意一个顶点作为起始点,并将之从 B 类移至 A 类;然后找出 B 类中到 A 类中的顶点之间权值最小的顶点,将之从 B 类移至 A 类,如此重复,直到 B 类中没有顶点为止。所走过的顶点和边就是该连通图的最小生成树。例如,通过普里姆算法查找图 2(a)的最小生成树的步骤为:假如从顶点A出发,顶点 B、C、D 到顶点 A 的权值分别为 2、4、2,所以,对于顶点 A 来说,顶点 B 和顶点 D 到 A 的权值最小,假设先找到的顶点 B:
继续分析顶点 C 和 D,顶点 C 到 B 的权值为 3,到 A 的权值为 4;顶点 D 到 A 的权值为 2,到 B 的权值为无穷大(如果之间没有直接通路,设定权值为无穷大)。所以顶点 D 到 A 的权值最小:
最后,只剩下顶点 C,到 A 的权值为 4,到 B 的权值和到 D 的权值一样大,为 3。所以该连通图有两个最小生成树:
具体实现代码为:
#include #include #define VertexType int#define VRType int#define MAX_VERtEX_NUM 20#define InfoType char #define INFINITY 65535typedef struct { VRType adj; //对于无权图,用 1 或 0 表示是否相邻;对于带权图,直接为权值。 InfoType * info; //弧额外含有的信息指针}ArcCell,AdjMatrix[MAX_VERtEX_NUM][MAX_VERtEX_NUM];typedef struct { VertexType vexs[MAX_VERtEX_NUM]; //存储图中顶点数据 AdjMatrix arcs; //二维数组,记录顶点之间的关系 int vexnum,arcnum; //记录图的顶点数和弧(边)数}MGraph;//根据顶点本身数据,判断出顶点在二维数组中的位置int LocateVex(MGraph G,VertexType v){ int i=0; //遍历一维数组,找到变量v for (; i if (G.vexs[i]==v) { return i; } } return -1;}//构造无向网void CreateUDN(MGraph* G){ scanf("%d,%d",&(G->vexnum),&(G->arcnum)); for (int i=0; ivexnum; i++) { scanf("%d",&(G->vexs[i])); } for (int i=0; ivexnum; i++) { for (int j=0; jvexnum; j++) { G->arcs[i][j].adj=INFINITY; G->arcs[i][j].info=NULL; } } for (int i=0; iarcnum; i++) { int v1,v2,w; scanf("%d,%d,%d",&v1,&v2,&w); int m=LocateVex(*G, v1); int n=LocateVex(*G, v2); if (m==-1 ||n==-1) { printf("no this vertex\n"); return; } G->arcs[n][m].adj=w; G->arcs[m][n].adj=w; }}//辅助数组,用于每次筛选出权值最小的边的邻接点typedef struct { VertexType adjvex;//记录权值最小的边的起始点 VRType lowcost;//记录该边的权值}closedge[MAX_VERtEX_NUM];closedge theclose;//创建一个全局数组,因为每个函数中都会使用到//在辅助数组中找出权值最小的边的数组下标,就可以间接找到此边的终点顶点。int minimun(MGraph G,closedge close){ int min=INFINITY; int min_i=-1; for (int i=0; i //权值为0,说明顶点已经归入最小生成树中;然后每次和min变量进行比较,最后找出最小的。 if (close[i].lowcost>0 && close[i].lowcost < min) { min=close[i].lowcost; min_i=i; } } //返回最小权值所在的数组下标 return min_i;}//普里姆算法函数,G为无向网,u为在网中选择的任意顶点作为起始点void miniSpanTreePrim(MGraph G,VertexType u){ //找到该起始点在顶点数组中的位置下标 int k=LocateVex(G, u); //首先将与该起始点相关的所有边的信息:边的起始点和权值,存入辅助数组中相应的位置,例如(1,2)边,adjvex为0,lowcost为6,存入theclose[1]中,辅助数组的下标表示该边的顶点2 for (int i=0; i if (i !=k) { theclose[i].adjvex=k; theclose[i].lowcost=G.arcs[k][i].adj; } } //由于起始点已经归为最小生成树,所以辅助数组对应位置的权值为0,这样,遍历时就不会被选中 theclose[k].lowcost=0; //选择下一个点,并更新辅助数组中的信息 for (int i=1; i //找出权值最小的边所在数组下标 k=minimun(G, theclose); //输出选择的路径 printf("v%d v%d\n",G.vexs[theclose[k].adjvex],G.vexs[k]); //归入最小生成树的顶点的辅助数组中的权值设为0 theclose[k].lowcost=0; //信息辅助数组中存储的信息,由于此时树中新加入了一个顶点,需要判断,由此顶点出发,到达其它各顶点的权值是否比之前记录的权值还要小,如果还小,则更新 for (int j=0; j if (G.arcs[k][j].adj theclose[j].adjvex=k; theclose[j].lowcost=G.arcs[k][j].adj; } } } printf("\n");}int main(){ MGraph G; CreateUDN(&G); miniSpanTreePrim(G, 1);}
图 3 无向网
使用普里姆算法找图 3 所示无向网的最小生成树的测试数据为:
6,10
1
2
3
4
5
6
1,2,6
1,3,1
1,4,5
2,3,5
2,5,3
3,4,5
3,5,6
3,6,4
4,6,2
5,6,6
运行结果为:
v1 v3
v3 v6
v6 v4
v3 v2
v2 v5普里姆算法的运行效率只与连通网中包含的顶点数相关,而和网所含的边数无关。所以普里姆算法适合于解决边稠密的网,该算法运行的时间复杂度为:
O(n2)
。如果连通网中所含边的绸密度不高,则建议使用克鲁斯卡尔算法求最小生成树(下节详细介绍)。
-
完全图公式 非连通无向图有28条边,至少有多少顶点 一个链式队列的队头和队尾指针分别为f和r,则判断队空的...
2020-12-22 20:59:45n个端点的完全图有n个端点以及n(n − 1) / 2条边,以Kn表示 例题: 非连通无向图有28条边,至少有多少顶点 8个点全联通27 ,加上一个孤立点; 所以28条边的非连通无向图为9个(加入一个孤立点) 一个链式队列的队...目录
一个链式队列的队头和队尾指针分别为f和r,则判断队空的条件为
完全图公式
n个端点的完全图有n个端点以及n(n − 1) / 2条边,以Kn表示
例题:
非连通无向图有28条边,至少有多少顶点
8个点全联通27 ,加上一个孤立点;
所以28条边的非连通无向图为9个(加入一个孤立点)
一个链式队列的队头和队尾指针分别为f和r,则判断队空的条件为
A.f!=NULL
B.r!=NULL
C.f==NULL
D.f==r在用单链表表示的链式队列Q中
队头指针为Q->front,队尾指针为Q->rear,则队空条件为Q->front ==Q->rear 答案:×
不要混淆队列和循环队列
-
数据结构学习笔记—图---图的连通性、顶点间的路径
2019-09-22 09:20:19在无向图中,如果从顶点Vi到顶点Vj有路径,则称Vi和Vj连通。若图中任意两个两个顶点之间都连通——连通图。 极大连通子图——连通分量。...对于无向图,有n个顶点,则有有n(n-1)/2条边; 对于有... -
1761 一个图中连通三元组的最小度数
2021-02-14 13:38:53连通三元组的度数 是所有满足此条件的边的数目:一个顶点在三元组内,而另一个顶点不在三元组内。 请你返回所有连通三元组中度数的 最小值 ,如果图中没有连通三元组,那么返回 -1 。 示例 1: 输入:n = 6, edges ... -
5679. 一个图中连通三元组的最小度数
2021-02-14 19:11:28连通三元组的度数是所有满足此条件的边的数目:一个顶点在三元组内,而另一个顶点不在三元组内。 请你返回所有连通三元组中度数的最小值,如果图中没有连通三元组,那么返回-1。 示例 1: 输入:n = 6, ... -
LeetCode 5679. 一个图中连通三元组的最小度数(枚举)
2021-02-14 16:02:38连通三元组的度数 是所有满足此条件的边的数目:一个顶点在三元组内,而另一个顶点不在三元组内。 请你返回所有连通三元组中度数的 最小值 ,如果图中没有连通三元组,那么返回 -1 。 数据范围: 2 <= n <= ... -
【算法及其原理】 Tarjan——求有向图中的强连通分量
2018-02-25 20:43:27强连通分量定义:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是... -
tarjan有向图的强连通
2017-07-16 09:41:00强连通分量:在非强连通图中的极大强连通子图,就称为强连通分量。 直接根据定义,可以通过双向遍历取交集的方法求强连通分量,但是其复杂度为O(N^2+M)。更好的方法是用tarjan算法,其时间复杂度为O(N+M)。 ... -
Prim算法(求连通图的最小加权数)
2018-02-27 10:26:00Prim算法涉及到的几个基础知识生成树: 一个连通图的生成树是它的极小连通子图,在n个顶点的情形下,有n-1条边。生成树是对连通图而言的,是连通图的极小连通子图,包含途中所有顶点,有且仅有n-1条边。非连通图的... -
图的连通性
2018-10-13 15:58:56生成树:包含图中全部n个顶点,但只有足以构成一棵树的n-1条边 深度优先生成树、广度有限生成树 最小生成树:权值最小且没有回路 有向无环图:无环的有向图 构造最小生成树的算法 普里姆算法:不断寻找顶点相邻且... -
图的点连通度边连通度总结
2015-08-12 21:57:51图的点连通度边连通度总结 点连通度的定义:一个具有N个点的图G中,在去掉任意k-1个顶点后(1),所得的子图仍然连通,去掉K个顶点后不连通,则称...在上图中有一个具有7个定点的连通图,从顶点1到顶点3有3条独立轨,即 -
有向图强连通分量的Tarjan算法
2010-06-11 20:09:00[有向图强连通分量]在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。非强连通图有向图的极大强连通子图,称为强连通... -
poj 1966(顶点连通度)
2013-09-24 12:18:00(1)原图G中的每个顶点v变成网络中的两个顶点v‘和v’‘,顶点v’至v''有一个条弧(有向边)连接,弧容量为1; (2)原图G中的每条边e=uv,在网络中有两条弧e'=u''v',e''=v''u'与之对应,e'弧容量为oo(无穷) ,e... -
普里姆(Prim)算法之加权连通图的最小生成树问题
2020-03-31 17:51:23(3)连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数值,称为权,权代表着连接两个顶点的代价,称这种连通图叫做连通网 (4)生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个... -
克鲁斯卡尔(Kruskal)算法之加权连通图的最小生成树问题
2020-03-31 22:23:54(3)连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数值,称为权,权代表着连接两个顶点的代价,称这种连通图叫做连通网 (4)生成树:一个连通图的生成树是指一个连通子图,它含有图中全部 n.... -
POJ 1966 Cable TV Network(顶点连通度)
2015-09-09 22:39:09点连通度:一个具有N个点的图G中,在去掉任意k-1个顶点后(1 独立轨:A,B是图G(有向无向均可)的两个顶点,我们称为从A到B的两两无公共内顶点的轨为独立轨,其最大条数记作P(A,B)。 设A和B是无向连通图G两个不... -
图的点连通度和边连通度
2014-10-19 22:12:18点连通度的定义:一个具有N个点的图G中,在去掉...在上图中有一个具有7个定点的连通图,从顶点1到顶点3有3条独立轨,即p(1,3)=3; 1—2—3 , 1—7—3 , 1—6—5—4—3 如果分别从这3条独立轨中,每条轨抽出一个内点 -
课堂笔记:有向无环图及其应用、图的连通性
2019-12-02 21:17:23AOV网 AOV网:在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的优先关系,称...拓扑序列: 设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1, v2, …, vn称为一个拓扑序列,当且仅当满足下列... -
无向图的顶点的度怎么算_数据结构习题解答:图 | 选择题
2020-12-03 17:59:25在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的(B)倍。A.1/2B.1C.2D.42....在一个具有n个顶点的无向图中,要连通全部顶点至少需要(C)条边。A.nB.n+1C.n-1D.n/24.下面关于图的存储结... -
图的应用(AOV网、AOE网、图连通性)
2019-12-01 13:31:36图的应用(AOV网、AOE网、图连通性): AOV网: 在一个表示工程的有向图中,用顶点表示活动,用弧表示活动之间的...设G=(V,E)是一个具有n个顶点的有向图,V中的顶点序列v1, v2, …, vn称为一个拓扑序列,当且仅当满... -
用类似并查集的方法判断无向图的连通性
2020-05-06 08:55:22这里简单点说,就是在一开始独立的N个元素的集合中,把有一定关联的元素集合到一起,使得他们有共同的父结点(其实就是同一个根结点),并查集使用完成以后我们看到的会是一个森林(哪怕是只有一颗树的)。对于图的... -
图 无向图保证连通性
2019-09-16 19:43:56无向图有8个顶点,保证无论何种情况下图都是联通的,则最少的边的数目? 要保证无向图G在任何情况下都是连通的, 即任意变动图G中的边,G始终保持连通。 首先需要图G的任意7个结点构成完全连通子图G1,需n(n-1)/2... -
(看了包会)连通子图、连通分量、极大连通子图、极小连通子图
2020-03-24 12:11:31无向图 连通 在无向图中,若从顶点v到顶点w有路径...(若一个图中有n个顶点,并且边数小于n-1,则此图一定是非连通图) 连通分量(也就是极大连通子图) 无向图中极大连通子图称为连通分量。 无向图分为连通图... -
2021-1 找出图中强连通分量 理论准备
2021-01-24 23:18:18必要概念 如果两个顶点是相互可达的,那么他们是强连通的。...一个含有N个顶点的有向图,如果是有向无环图,那么他有N个强联通分量。如果是强连通图,那么他只有一个强联通分量。一般的,联通分量 -
获得无向图连通子图_数据结构习题解答:图 | 选择题
2021-01-10 03:24:17在一个有向图中,所有顶点的入度之和等于所有顶点的出度之和的(B)倍。A.1/2B.1C.2D.42....在一个具有n个顶点的无向图中,要连通全部顶点至少需要(C)条边。A.nB.n+1C.n-1D.n/24.下面关于图的存储结... -
如何生成有向图_MST (minimum spanning tree)最小生成树算法在三维点云的分割的应用...
2021-01-13 08:22:38一、概念准备MST最小生成树算法是一种图论的算法。连通图:无向图中,任意两个顶点都有路径相通。强连通图:有向图中,任意两个顶点都有路径...一颗有n个顶点的生成树有且仅有n-1条边,如果生成树中再添加一条边,则...
-
博客用到的相关类与JDBC连接内容.rar
-
用微服务spring cloud架构打造物联网云平台
-
linux基础入门和项目实战部署系列课程
-
在C#方法中使用using的意义
-
物联网基础篇:快速玩转MQTT
-
2的次幂表示
-
DHCP 动态主机配置服务(在Linux环境下,配置单网段或跨网段提)
-
Gocad2013.rar
-
[webpack-cli] SyntaxError: Invalid regular expression: /(\p{Uppercase_Letter}+|\p{Lowercase_Letter}|
-
Java DBUtils教程导航
-
数字电路.xmind
-
Qt 判断一个IPV4 地址单播/组播/广播地址
-
MySQL 高可用工具 heartbeat 实战部署详解
-
c#委托
-
OptiFine_1.16.5_HD_U_G7.jar
-
numpy数组取某一列的坑
-
VXWorks7.txt
-
IO系列学习总结三:三张图带你了解NIO通信程序的执行流程
-
DSP 28335国产替代
-
基于SSM实现的房屋租赁系统【附源码】(毕设)