无向图的生成树
离散数学
(注)以上算法需假定图中每条边的权都不 相同.但事实上对图中有若干条边的权相同的情 形,只要将它们的权作微小的变动,使之各不相同, 即可使用这个算法.
例:见书本图9.4
又有计算最小生成树的实例:
1 11
6
3 2
9
7 8
10
4 5
红绿粉红紫黄
另有“破圈法”:删除边破坏回路,同时保持图的连 通性,直到没有回路为止。 a
注意,具有 n 个结点和恰有 n-1 条边的图未 必是树,但连通或无回路的是。 连通无圈完全刻划了树,这是树的一个特
性;树还有另外一个重要性质是:它以最少的
边使结点连通。
定理9.2 给定树T=<V,E>,若|V|≥2,则T中至 少存在两个悬挂结点(树叶)。
证明: 1)设T=<V,E>是树,|V|=v.因为T是连通图,viT 有deg(vi)≥1且由定理5-1.1有∑deg(vi)=2(|V|-1)=2v-2.
例:下图为根树,右边是左图省掉方向的代替图。
v1
v2 v3 v4 v2
v1
v3 v4
v5
v6
v7
v8 v9
v5
v6
v7
v8 v9
v10 v11 v12
v10
v11 v12
为表示结点间的关系,有时借用家族中的
术语。一棵根树可以看成一棵家族树。令u是有
根树中的分枝结点,若从u到v有一条边或,则 结点v称为结点u的“儿子”,或称u是v的“父 亲”;若从u到w有一条路,称u是w的“祖先”, 或称w是u的“子孙”或“后代”,同一个分枝
第九章 树
9.1 无向树及生成树
9.2 根树及其应用
树与生成树
因为T连通,所以(T) 1,由m=n-1及 d(v)=2m得,T中至少存在一点u,使 得d(u)=1。考虑T’=T-u,显然T’连通, 且|E(T’)|=|V(T’)|-1,由归纳假设,T’ 无回路,所以T无回路。
⑹ T无回路且m=n-1. ⑴ T无回路的连通图. ⑹k由⑴⑹2:得假。,设对任T不意连的通T,i,设TiT是1无, T回2,…路,的T连k为通T图的,连所通以分T支i是,树则,
283 164 75
23 184 765
2 83 14 7 65
283 16 754
23 184
…………………..
765
123 84
765
123 8 4 目标结点
7 65
五.m叉树与完全m叉树
1.m叉树:在根树中,如果每个结点的出度最大是m, 则称
此树是m叉树.
2.完全m叉树:在根树中,如果每个结点的出度都是m或者
7.树高:从树根到各个叶结点的路径中, 最长路径的长度,
称为该树的高度(树高).
三.举例: a)语法树
主语
句子
谓语短语
冠词
形容
词
The little
b)算术表达式树 ((a+b)÷c)×(d-e)
名 词 boy
÷
动词
宾
语 冠词
名
saw
词
The apple ×
-
+
cd
e
a
b
c)判定树:有四枚金币a,b,c,d,已知道三个是真的,最多一 个是假的,它们的外表完全相同,只是重量有点差别.给你 一架天平找出假币.
4.森林:一个无向图的每个连通分支都是树.如(b)
离散数学7-树
(b)
(a)
V5
2
1
V7
8
9
V2
V4
2
3
V8
5
V1
V1
V4
V5
1
3
V7
V6
8
V4
2
V8
5
6
V1
1
V5
6
V7
V6
8
3
V8
5
6
V7
9
V3
(e)
V3
(f)
(g)
22
V2
V3
(h)
五.应用举例——求最小生成树
例3 用管梅谷算法求下图的最小生成树。
23
五.应用举例——求最小生成树
例3 用管梅谷算法求下图的最小生成树。
成圈。
首先证明T无简单回路。对n作归纳证明。
(i) n=1时,m=n-1=0,显然无简单回路;
(ii)假设顶点数为n-1时无简单回路,现考察顶点数是n的情况:此时至少有一
个顶点v其次数d(v)=1。因为若n个顶点的次数都大于等于2,则不少于n条边,但这与
m=n-1矛盾。
删去v及其关联边得到新图T’,根据归纳假设T’无简单回路,再加回v及其关联
边又得到图T,则T也无简单回路。
再由图的连通性可知,加入任何一边后就会形成圈,且只有一个圈,否则原图
中会含圈。
9
二. 基本定理——证明
证明(4):(3)(4),即证一个无圈图若加入任一边就形成圈,
则该图连通,且其任何一边都是桥。
若图不连通,则存在两个顶点vi和vj,在vi和vj之间没有路,若
加边(vi,vj)不会产生简单回路,但这与假设矛盾。由于T无简单回
一棵生成树的基本回路系统
一棵生成树的基本回路系统1.引言1.1 概述在计算机科学领域,生成树和回路系统是图论中的两个重要概念。
生成树是一个无向图的子图,它包含了原图的所有顶点,并且是一个连通图,即任意两个顶点之间都存在唯一的路径。
回路系统是图中由一些边和顶点构成的闭合路径的集合,每个闭合路径中的顶点和边都具有特定的关联性。
生成树和回路系统在实际问题的建模和求解中发挥着重要作用。
生成树可以用来描述一些优化问题,例如最小生成树问题,该问题的解决方法可以用来确定一个连通图的子图,使得这个子图的所有边的权重之和最小。
回路系统则常常出现在电路分析和网络规划中,用于描述电路中的闭合路径和网络中的环路。
本文将着重讨论生成树和回路系统的基本概念、定义和特性,探究它们之间的关系,并深入探讨它们在实际应用中的意义和应用领域。
接下来的章节将依次介绍生成树的基本概念和回路系统的定义与特性,以及它们在图论和实际问题中的应用。
通过对这些内容的研究和探讨,读者将能够更好地理解生成树和回路系统的内涵,进而应用于更广泛的领域中。
总之,生成树和回路系统作为图论中的核心概念,对于解决实际问题和优化分析具有重要意义。
本文将通过深入探讨它们的基本概念和特性,帮助读者更好地理解和应用这些概念,并展示它们在不同领域中的广泛应用。
文章结构部分的内容应该包括对整篇文章的组织和章节安排的介绍。
在本篇文章中,我们将按照以下结构来组织内容:1. 引言1.1 概述1.2 文章结构1.3 目的2. 正文2.1 生成树的基本概念2.2 回路系统的定义和特性3. 结论3.1 生成树和回路系统的关系3.2 应用领域和意义在引言部分,我们将首先对整篇文章进行一个简要的概述,介绍生成树和回路系统的基本概念,并明确文章的目的。
接下来,在正文部分,我们将详细讨论生成树的基本概念,包括什么是生成树以及它的特性。
然后,我们将介绍回路系统的定义和特性,探讨回路系统在图论中的重要性以及和生成树的关系。
2011年数据结构期末试题(附完整答案)
15.串是一种特殊的线性表,其特殊性体现在( ) A.可以顺序存储 B.数据元素是一个字符 C.可以链接存储 D.数据元素可以是多个字符 16.树的基本遍历策略分为先根遍历和后根遍历;二叉树的基本遍历策 略可分为先序遍历、中序遍历和后序遍历。结论( )是正确的。 A.树的先根遍历序列与其对应的二叉树的先序遍历序列相同 B.树的后根遍历序列与其对应的二叉树的先序遍历序列相同 C.树的先根遍历序列与其对应的二叉树的中序遍历序列相同 D.以上都不对 17.由五个分别带权值为9,2,3,5,14的叶子结点构成的一棵哈夫曼 树,该树的带权路径长度为( )。 A. 60 B. 66 C. 67 D. 50 18.一棵二叉树有67个结点,这些结点的度要么是0,要么是2。这棵二 叉树中度为2的结点有( )个 A. 33 B. 34 C. 32 D. 30 19.有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当二分查找 值82为的结点时,( )次比较后查找成功。 A. 1 B. 2 C. 4 D. 8 20.若有文件的关键字序列为:[265] [301] [751] [129] [937] [863] [742] [694] [076] [438],以下为二路归并排序过程。第二趟为: A.[265 301] [129 751] [863 937] [694 742] [076 438] B.[076 129 265 301 438 694 742 751 863 937] C.[129 265 301 694 742 751 863 937] [076 438] D.[129 265 301 751] [694 742 863 937] [076 438]
⑴ ⑷
⑵ ⑸
⑶
3.请在标号处填写合适的语句。完成下列程序。(每空1分,共5分) int Binary_Search(S_TBL tbl,KEY kx) { /* 在表tbl中查找关键码为kx的数据元素,若找到返回该元素在表中的位 置,否则,返回0 */ int mid,flag=0; low=1;high=length; while( ⑴ &!flag ) { /* 非空,进行比较测试 */ mid= ⑵ ; if(kx<tbl.elem[mid].key) ⑶ ; else if(kx>tbl.elem[mid].key) ⑷ ; else { flag= ⑸ ;break;} } return flag; } ⑴ ⑵ ⑶ ⑷ ⑸
10图论-树11-24
2)树的性质 给定的无向图—树是边数最小的连通图(m<n-1则不连通) 树是边数最多的无回路图(m>n-1则有回路) 无向树结点的度: Σd(vi) = 2 m =2(n-1) T是n阶非平凡的无向树,则T中至少有两片树叶 二、生成树 一些连通图不是树,但子图是树-重要的是生成树 1、定义:设T是无向图G的子图并且为树,则称T为G的树 若T是G的树且为生成子图,则称T是G的生成树 T是G的生成树,则称T的边e为T的树枝 否则称e为T的弦(虚线). 并称由弦导出子图G[E(G)—E(T)]为T的余树, 记作T (T不一定连通,也可能含有回路) 2、生成树的性质 定理:无向图G具有生成树当且仅当G是连通图 设G为n阶m条边的无向连通图,则m =|E(G)|≥|E(T)| = n - 1 设G是n阶m 条边的无向连通图,T为G的生成树 则T的余树T中含m - n十1条边(即T有m—n+1条弦)
3、二叉树的周游(遍历) 对于一棵二叉树的每一个结点都访问一次且仅一次的操作 周游的方法有三种: 中序遍历 访问的次序:左子树-根-右子树 前序遍历 访问的次序:根-左子树-右子树 后序遍历 访问的次序:左子树-右子树-根 树的周游(遍历)的结果: 得出结点的访问次序 表达式的表示:(a*(b+c)+d*e*f)/(g+(h-i)*j) 对应的二叉树 后序遍历的结果: ((a(bc+)*)(d(ef*)*)+)(g((hi-)j*)+)/ 逆波兰式 = abc+*def**+ghi-j*+/ 前序遍历的结果:/(+(*a(+bc))(*d(*ef)))(+g(*(-hi)j)) 波兰式 =/+*a+bc*d*ef+g*-hij 例:给定二叉树,写出三 种访问结点的序列 例:给定二叉树周游的二种周 游序列,画出该二叉树
无向树及生成树
一、无向树及其性质
1、 无向树 定义 5-17:不包括回路的无向连通图称为无向树, 简称树,记为 T . (1)两棵以上的图称为森林。 (2)设 T 是树,则 T 的边称为树枝。 (3)树中度数为 1 的结点,称为树叶。 (4)树中度数大于等于 2 的结点称为分支点。
一、无向树及其性质
2、 树的性质 性质 1 设 v1 , v 2 是 T 的两个不同结点, 则连接 v1 , v 2 有 且仅有一条通路,而且这条通路是初级通路。 性质 2 设 v1 , v 2 是 T 的两个结点, 如果 v1 , v 2 不邻接, 则在 T 中添加边 v1 , v 2 后所得的图有且仅有一条回 路,而且这条回路是初级回路。
一、无向树及其性质
2、 树的性质 性质 3 树中任意删除一条边后所得的图是不连通 的。 性质 4 设 T 是 (n, m) 树,则 m n 1。 性质 5 设树 T 的结点数为 n(n 2) ,则至少两片树 叶。
一、无向树及其性质
2、 树的性质
例 5-7:设树 T 中有 7 片树叶,3 个 3 度结点,其余 都是 4 度结点,问: T 中有几个 4 度结点? 例 5-8.设树 T 中有 1 个 3 度结点,2 个 2 度结点, 其余结点都是树叶,问 T 中有几片树叶? 例 5-9 画出所有 6 个顶点非同构的无向树。
e1 , e2 ,, em ,它们带的权分别为 a1 , a2 ,, am ,不妨
设 a1 a2 am (1) 一开始取权最小的边 e1 , 且 w(e1 ) a1 , 取
e1 在 T 中。
三、求最小生成权的克鲁斯科尔算法
( 2)若 e2 不与 e1 构成回路,将 e2 添加在 T 中,否 则放弃 e2 ,再查 e 3 ,继续这一过程,直到得到的子 图就是所求的一棵最小生成树 T 为止。
求无向图的最小生成树算法——Prim与Kruskal
1.算法思想
对于图G=(V,E),用Prim算法求最小生成树T=(S,TE)的流程如下
① 初始化:设S、TE为空集,任选节点K加入S。
② 选取一条权值最小的边(X,Y),其中X∈S,且not (Y∈S) 即,选取一条权值最小的、连接着S中一点与S外一点的边。
以上操作重复|V|-1次结束。由于每次加入S的点i都在当时取到了符合流程②的边min{lowcost},而lowcost[i]=w(i,closest[i]),所以此时的最小生成树的各边就是(i,closest[i]),i∈V且not (i=x)【需要注意的是出发点x的closest[x]还是x,所以应忽略,实际取到x-1条边】。把i从1取到|V|,便得到最小生成树T的每条边。
为了比较快速地选边,我们用两个数组lowcost、closest动态地维护每一个点到S的最短距离。在某一状态下,lowcost[i]表示所有与i相连且另一端点在S中的边中的权值最小值,closest[i]表示在S中且与i相连的点中与i之间距离最小的点。显然,lowcost[i]=w(i,closest[i])。需要注意的是两个数组记录的都是边而不是路径。若i没有边直接连向S,则lowcost[i]=∞。另外,若i已在S中,则lowcost[i]=0。
lowcost[j] = w[k][j];
closest[j] = k;
} //由新加入S中的k点使某些点到S的距离缩短,所以更新各点的lowcost和close= 1; i <= n; i++)
if(i != closest[i]){
设出发点为x。初始时对于任意k∈V,closest[k]=x,lowcost[k]=w(k,x)【w(i,j)表示i、j间的距离。初始化时,若两点间没有边则w(i,j)赋为一个足够大的整数(如maxint),并且所有点到自身的距离赋为0,即w(i,i)=0】
数据结构与算法复习题(专升本)
《数据结构与算法》复习题(专升本)一、填空题1、数据结构被形式地定义为( D, R),其中D 是的有限集合, R 是D 上的有限集合。
2、数据结构包括数据的、数据的和数据的这三个方面的内容。
3、写出带头结点的双向循环链表L 为空表的条件。
4、在具有n个元素的循环队列中,队满时具有个元素。
5、求子串在主串中首次出现的位置的运算称为。
6、由3个结点所构成的二叉树有种形态。
7、数据的逻辑结构是指。
8、数据结构按逻辑结构可分为两大类,它们分别是和。
9、线性结构中元素之间存在关系,树形结构中元素之间存在关系,图形结构中元素之间存在多对多关系。
10、带头结点的单链表head 为空的条件是。
11、两个串相等的充分必要条件是两个串的长度相等且。
12、二维数组,可以按照和两种不同的存储方式。
13、一棵具有257个结点的完全二叉树,它的深度为。
14、内部排序方法按排序采用的策略可划分为五类:、、、和基数排序。
二、选择题1、若某线性表中最常用的操作是取第i 个元素和找第i个元素的前驱,则采用()存储方法最节省时间。
A.顺序表B.单链表C.双链表D.单循环链表2、二叉树的前序序列和后序序列正好相反,则该二叉树一定是()的二叉树。
A.空或只有一个结点B.高度等于其结点数C.任一结点无左孩子D.任一结点无右孩子3、计算机算法指的是:()A. 计算方法B. 排序方法C. 解决问题的有限运算序列D. 调度方法4、栈和队列的主要区别在于()。
A.它们的逻辑结构不一样B.它们的存储结构不一样C.所包含的运算不一样D.插入删除运算的限定不一样5、为5个使用频率不等的字符设计哈弗曼编码,不可能的方案是()。
A.000,001,010,011,1B. 0000,0001,001,01,1C.000,001,01,10,11D.00,100,101,110,1116、用深度优先遍历方法遍历一个有向无环图,并在深度优先遍历算法中按退栈次序打印出相应的顶点,则输出的顶点序列是()。
无向树及生成树
2m=2(n1)=51+21+31+4(n7)
解出n=8, 4度顶点为1个.
T的度数列为1,1,1,1,1,2,3,4
有3棵非同构的无向树
生成树
生成树的存在性
定理任何无向连通图都有生成树.
证用破圈法.若图中无圈,则图本身就是自己的生成树.
否则删去圈上的任一条边,这不破坏连通性,重复进行
直到无圈为止,剩下的图是一棵生成树.
推论1设n阶无向连通图有m条边,则mn1.
推论2设n阶无向连通图有m条边,则它的生成树的余树
有mn+1条边.
基本回路与基本回路系统
定义设T是n阶m条边的无向连通图G的一棵生成
树,设e1, e2, … , emn+1为T的弦.设Cr为T添加弦er
(1)G是树(连通无回路);
(2)G中任意两个顶点之间存在惟一的路径;
(3)G中无回路且m=n1;
(4)G是连通的且m=n1;
(5)G是连通的且G中任何边均为桥;
(6)G中没有回路,但在任何两个不同的顶点之间加一条新边后所得图中有惟一的一个含新边的圈.
下次课预习要点:
有向树
根树、树根、树叶、内点、分支点
设G=<V,E,W>,将非环边按权从小到大排序:e1, e2, …, em.
(1)取e1在T中
(2)检查e2,若e2与e1不构成回路,则将e2加入T中,否则弃去e2.
(3)检查e3,…,重复进行直至得到生成树为止.
实例
例求图的一棵最小生成树
复习思考题、作业题:
设G=<V,E>是n阶m条边的无向图,则下面各命题是等价的:
离散数学第九章树知识点总结
生成树的存在性 定理 任何无向连通图都有生成树. 证 用破圈法. 若图中无圈, 则图本身就是自己的生成树.
否则删去圈上的任一条边, 这不破坏连通性, 重复进行 直到无圈为止,剩下的图是一棵生成树. 推论 1 设 n 阶无向连通图有 m 条边, 则 mn1. 推论 2 设 n 阶无向连通图有 m 条边, 则它的生成树的余树 有 mn+1 条边.
{0,10,010, 1010} 不是前缀码
例 在通信中,设八进制数字出现的频率如下:
0:25%
1:20%
2:15%
3:10%
4:10%
5:10%6:5% Nhomakorabea7:5%
采用 2 元前缀码, 求传输数字最少的 2 元前缀码 (称作最佳前
缀码), 并求传输 10n(n2)个按上述比例出现的八进制数字需
要多少个二进制数字?若用等长的 (长为 3) 的码字传输需要
推论 3 设
为 G 的生成树 T 的余树,C 为 G 中任意一个
圈,则 C 与
一定有公共边.
基本回路与基本回路系统
定义 设 T 是 n 阶 m 条边的无向连通图 G 的一棵生成 树,设 e1, e2, … , emn+1 为 T 的弦. 设 Cr 为 T 添加弦 er 产生的 G 中惟一的圈(由 er和树枝组成), 称 Cr 为对应 弦 er的基本回路或基本圈, r=1, 2, …, mn+1. 称{C1, C2, …, Cmn+1}为对应 T 的基本回路系统. 求基本回路的算法: 设弦 e=(u,v), 先求 T 中 u 到 v 的路径 uv, 再并上弦 e, 即得对应 e 的基本回路. 基本割集与基本割集系统定义 设 T 是 n 阶连通图 G 的一棵生成树, e1, e2, …, en1 为 T 的树枝,Si 是 G 的只含树枝 ei, 其他边都是弦
6无向树
推论
推论1: G是n阶m边无向连通图 mn-1.
推论2: T是n阶m边无向连通图G的生成树 , 则 |E(T)|=m-n+1.(称为连通图G的秩)
24
圈中一定有弦
设T是连通图G的生成树, C是G中的圈, 则 E( T )E( C ) ——圈中一定有弦 证明: (反证) 若E( T )E( C )=, 则 E( C )E( T ), T中有回路C, 与T是树矛盾!
e m=n-1 m=n-2
11
定理1(证明(5)(6))
(5) G极小连通: 连通 所有边是桥 (6) G极大无回: 无圈 增加任何新边得 唯一圈 证明(续): (5)(6): 所有边是桥无圈. u,vV, G连通, u,v之间有唯一路径, 则(u,v)是唯一的圈.
12
定理: 设T是无向连通带权图G=<V,E,W> 的生成树, 则 (1)T是G的最小生成树 (2) eE(T), e是基本割集Se的最小边 (3) eE(T), e是基本回 NhomakorabeaCe的最大边
34
求最小生成树的算法
避圈法(Kruskal,1956, mlnm)
贪心(Greedy)策略:
6
树的等价定义
定理1: 设G=<V,E>是n阶m边无向图,则 (1) G是树(连通无回) (2) G中任何2顶点之间有唯一路径 (3) G无圈 m=n-1 (4) G连通 m=n-1 (5) G极小连通: 连通 所有边是桥 (6) G极大无回: 无圈 增加任何新边 得唯一圈
G T
29
基本割集
设G是n阶m边无向连通图, T是G的生成 树, T={e1,e2,…,en-1}, n-1称为割集秩 基本割集: er对应的唯一割集Sr 基本割集系统: {S1,S2,…,Sn-1}
数据结构填空题
一、填空题1. 数据结构的存储结构包括顺序、(链接)、索引和散列等四种。
2. 设关键字序列{7,12,26,30,47,58,66,70,82,90},当用折半查找方法查找时,所需比较的次数为3次的关键字分别是(7 26 58 82)。
3. 假定一个线性表为{12, 23, 74, 55, 63, 40, 82, 36},若按key%3条件进行划分,使得同一余数的元素成为一个子表,则包含74的子表长度为(2)。
4. 和折半查找相比,顺序查找的优点是除了不要求表中数据元素有序之外,对( 存储)结构也无特殊要求。
5. 设双向循环链表每个结点结构为(data,llink,rlink),则结点*p的前驱结点的地址为( p->llink)。
6. n个顶点的连通无向图的生成树含有( n-1 )条边。
7. 在一个最大堆中,堆顶结点的值是所有结点中的( 最大值)。
8. 假定对长度n=50的有序表进行折半查找,则对应的判定树中最底下一层的结点数为(19 )个。
9. 对于带头结点的链栈top,取栈顶元素的操作是(*y=top->next->data)。
10. 假定一棵二叉树的结点个数为50,则它的最小高度为( 5 )。
假定树根结点的深度为0。
11. 二维数组是一种非线性结构,其中的每一个数组元素最多有( 2)个直接前驱(或直接后继)。
12. 在堆排序中,对任意一个分支结点进行调整运算的时间复杂度为( O(log2n) )。
13. 队列的删除操作在(队头(或队首))进行。
14. 设图G = (V, E),V = {1, 2, 3, 4}, E = {<1, 2>, <1, 3>, <2, 4>, <3, 4>},从顶点1出发,对图G进行广度优先搜索的序列有( 2 )种。
15. 向一棵二叉排序树中插入一个元素时,若元素的值小于根结点的值,则应把它插入到根结点的(左子树)上。
最小生成树唯一的充要条件
最小生成树唯一的充要条件最小生成树是图论中的一个重要概念,它是一棵生成树,包含所有图中的节点,并且具有最小的总权值。
在实际应用中,最小生成树被广泛运用于网络设计、城市规划等领域,因此,了解最小生成树的充要条件对于深入理解这些应用至关重要。
接下来,我们将介绍最小生成树唯一的充要条件。
一、什么是最小生成树最小生成树指的是一个无向图的生成树,它的所有边的权值之和最小。
一个无向图的生成树是指一棵树,包含所有图中的节点,并且只有图中的边。
因此,最小生成树是一个无向图的一种特殊情况。
二、最小生成树的唯一充要条件最小生成树有一个重要的性质,即它是唯一的当且仅当该无向图中不存在权值相同的边。
具体来说,设有一个无向图G=(V,E),其中V是节点的集合,E是边的集合。
假设生成树T是G的一个生成树,我们需要证明最小生成树T是唯一的当且仅当G中不存在权值相同的边。
充分性证明:首先,假设最小生成树T是唯一的,我们需要证明G中不存在权值相同的边。
假设存在权值相同的边e1和e2,它们的权值都为w。
根据前提条件,T是最小生成树,因此T必须包含一条边e1或e2,假设T包含边e1,那么将边e1替换成e2,得到一棵新的生成树T'。
此时,T'中还有n-2条边需要加入。
因为T是最小生成树,所以T'的总权值必须大于等于T的总权值。
但是,由于e1和e2都是权值为w的边,所以将其替换不会改变T的总权值,即T'的总权值等于T的总权值。
因此,T'不能是最小生成树,与前提条件不符。
综上所述,最小生成树T是唯一的,则G中不存在权值相同的边。
必要性证明:然后,我们需要证明G中不存在权值相同的边,则最小生成树T是唯一的。
假设存在两棵生成树T1和T2,它们的权值之和相等,但是它们不相同。
由于T1和T2都是生成树,因此它们都包含n-1条边。
我们假设T1中有一条边e不在T2中,而T2中有一条边f不在T1中。
由于e不在T2中,因此e和f可以构成一个环。
计算机学科专业基础综合数据结构-图(二)_真题-无答案
计算机学科专业基础综合数据结构-图(二)(总分100,考试时间90分钟)一、单项选择题(下列每题给出的4个选项中,只有一个最符合试题要求)1. 具有6个顶点的无向图至少应有______条边才能确保是一个连通图。
A.5 B.6 C.7 D.82. 设G是一个非连通无向图,有15条边,则该图至少有______个顶点。
A.5 B.6 C.7 D.83. 下列关于无向连通图特性的叙述中,正确的是______。
①所有顶点的度之和为偶数②边数大于顶点个数减1③至少有一个顶点的度为1A.只有① B.只有② C.①和② D.①和③4. 对于具有n(n>1)个顶点的强连通图,其有向边的条数至少是______。
A.n+1B.nC.n-1D.n-25. 下列有关图的说法中正确的是______。
A.在图结构中,顶点不可以没有任何前驱和后继 B.具有n个顶点的无向图最多有n(n-1)条边,最少有n-1条边 C.在无向图中,边的条数是结点度数之和 D.在有向图中,各顶点的入度之和等于各顶点的出度之和6. 对于一个具有n个顶点和e条边的无向图,若采用邻接矩阵表示,则该矩阵大小是______,矩阵中非零元素的个数是2e。
A.n B.(n-1)2 C.n-1 D.n27. 无向图的邻接矩阵是一个______。
A.对称矩阵 B.零矩阵 C.上三角矩阵 D.对角矩阵8. 从邻接矩阵可知,该图共有______个顶点。
如果是有向图,该图共有4条有向边;如果是无向图,则共有2条边。
A.9 B.3 C.6 D.1 E.5 F.4 G.2 H.09. 下列说法中正确的是______。
A.一个图的邻接矩阵表示是唯一的,邻接表表示也唯一 B.一个图的邻接矩阵表示是唯一的,邻接表表示不唯一 C.一个图的邻接矩阵表示不唯一,邻接表表示唯一 D.一个图的邻接矩阵表示不唯一,邻接表表示也不唯一10. 用邻接表存储图所用的空间大小______。
A.与图的顶点数和边数都有关 B.只与图的边数有关 C.只与图的顶点数有关 D.与边数的二次方有关11. 采用邻接表存储的图的深度优先搜索算法类似于二叉树的______,广度优先搜索算法类似于二叉树的层次序遍历。
树的几个证明
定理1 无向图T是树,当且仅当以下五条之一成立。
(1)T中无回路且m=n-1,其中m为边数,n为顶点数。
(2)T是连通图且m=n-1。
(3)T中无回路,但增一条边,则得到一条且仅一条初级回路。
(4)T连通且每条边均是桥。
(5)每对顶点间有唯一的一条初级通路。
证明①由树的定义可得(1)。
对顶点数n作归纳。
当n=1时,m=0,则m=n-1成立。
假设当n=k时,m=n-1成立。
则当n=k+1时,因为树是连通的且无回路,所以至少有一个度数为1的顶点v,从树中删去v和与它关联的边,则得到k个顶点的树T′。
根据假设它有k-1条边,现将v和与它关联的边加到T′上还原成树T,则T有k+1个顶点,k 条边,边数比顶点数少1,故m=n-1成立②由(1)可得(2)。
再证反证法,若图T不连通,设T有k个连通分支T1,T2,…,Tk(k≥2),其顶点数分别为n1,n2,…,nk,则有n1+n2+…+nk=n边数分别为m1,m2,…,mk,则有m1+m2+…+mk=n其中:m1=n1-1,m2=n2-2,……mk=nk-1.因此,有m=n1+n2+……+nk-k=n-k<n-1即m<n-1,这与m=n-1矛盾,故T是连通的m=n-1图。
③由(2)可得(3)。
若T是连通图并有n-1条边。
施归纳于顶点数n。
当n=2时,m=n-1=1,所以没有回路,如果增加一条边,只能得到唯一的一个回路。
假设n=k时,命题成立。
则当n=k+1时,因为T是连通的并有n-1条边,所以每个顶点都有d(v)≥1,并且至少有一个顶点v0,满足d(v0)=1。
否则,如果每个顶点v都有d(v)≥2,那么必然会有总度数2m≥2n,即m≥n,这与条件m=n-1矛盾。
因此至少有一个顶点v0,满足d(v0)=1。
删去v0及其关联的边,得到图T′,由假设知T′无回路,现将v0及其关联的边再加到T′,则还原成T,所以T没有回路。
如果在连通图T中增加一条新边(vi,vj),则(vi,vj)与T中从vi到vj的一条初级路径构成一个初级回路,且该回路必定是唯一的,否则当删去新边(vi,vj)时,T中必有回路,产生矛盾。
无向连通图的生成树个数
⽆向连通图的⽣成树个数我们知道,每个⽆向连通图都会有⾃⼰的⽣成树。
但是⼤家更熟悉的,是⽆向图的最⼩⽣成树(MST)算法。
本⽂旨在讨论计算⽆向连通图的⽣成树个数的时间复杂度为O(n3)的⽅法。
另外⼀种时间效率⾼的递推式⽅法的讲解在⽂末附有链接。
我们可以利⽤矩阵在O(n3)的时间内求出⽆向连通图的⽣成树个数。
对于⼀个⽆向连通图,我们可以根据以下规则列出⼀个矩阵M:1. 主对⾓线上的值M(i,i)为i节点的度。
2. a[i,j]的值为点i到点j的平⾏边的条数的相反数。
显然,如果i,j不连通,M(i,j)=0。
通过这样的规则,⼀个矩阵就在O(n2)的时间内建⽴起来。
以图1为例。
这样,我们就得到了矩阵M:参考代码(init):beginfillchar(ma,sizeof(ma),0);readln(n,m);for i:=1 to n dofor j:=1 to n dobeginread(x);if x=1 thenbeginma[i,i]:=ma[i,i]+1;ma[i,j]:=-1;end;end;end.恩,有了这个矩阵有什么⽤呢?【定理】删除矩阵中任意⼀个节点的信息,求出剩下的(n-1)*(n-1)矩阵的⾏列式的值,此值即为这个⽆向连通图的⽣成树个数。
定理的证明在这⾥不再赘述(其实我也不会,知道怎么证明⼜有什么⽤呢可以⽤数学归纳法证明),如果想知道详细的证明过程,可以参阅⽂末所附的参考⽂献,或者在⽹上查阅。
经过删除操作,我们得到如下的矩阵M’:可是,⾏列式的值怎么求呢?我们知道⾏列式值的⼿⼯求法是经过将⾏列式降阶,通过如下的定理求得:【定理】三阶⾏列式D= 的值等于它任意⼀⾏(列)的所有元素与它们对应的代数余⼦式乘积之和。
即:⽤等式表⽰为:当阶数很⾼,这种⽅法由于要递归、压栈,不但占⽤⼤量内存,⽽且代码复杂度很⾼(现在我还没有打出来过 *.*||)。
在这⾥,我们⽤⾼斯消元的思想将⾏列式转化成⼀个下三⾓⾏列式,运⽤以下性质即可求出⾏列式的值。
图论——树
森林
推论: 具有k个分支的森林有nk条边, 其中n是G的顶点数。
无向树的性质
定理2.2
证明
设T是n阶非平凡的无向树,则T中至少有两片树叶。
设T有x片树叶,由握手定理及定理2.1可知,
2(n 1) d (vi ) x 2(n x)
由上式解出x≥2。
例2.1
例2.1 画出6阶所有非同构的无向树。 解答 设Ti是6阶无向树。
唯一性(反证法)。 若路径不是唯一的,设Г1与Г2都是u到v的路径, 易知必存在由Г1和Г2上的边构成的回路, 这与G中无回路矛盾。
(2)(3)
如果G中任意两个顶点之间存在唯一的路径, 则G中无回路且m=n-1。 首先证明 G中无回路。 若G中存在长度大于2的圈, 则圈上任何两个顶点之间都存在两条不同的路径, 这也与已知矛盾。
说明
注意:T 不一定连通,也不一定不含回路。
生成树的存在条件
定理2.3 无向图G具有生成树当且仅当G连通。 证明 必要性,显然。 充分性(破圈法)。 若圈,任取一圈,随意地删除圈上的一条边,
若再有圈再删除圈上的一条边,直到最后无圈为止。 易知所得图无圈(当然无回路)、连通且为G的生成子图, 所以为G的生成树。
分支点—— 7个
高度—— 5
家族树
常将根树看成家族树,家族中成员之间的关系如下定义。 定义2.7 设T为一棵非平凡的根树, vi、vj∈V(T),若vi可达vj,则称vi为vj的祖先,vj为vi的后代。 若vi邻接到 vj(即 <vi,vj>∈E(T)), 则称vi 为 vj的父亲,而 vj为 vi 的儿子。 若vj、vk的父亲相同,则称vj与vk是兄弟。 定义2.8 设v为根树T中任意一顶点,称v及其后代的导出子图为 以v为根的根子树。
矩阵树定理证明
矩阵树定理证明
矩阵树定理是图论中的一个经典定理,用于计算一个无向图的生
成树数量。
该定理指出,一个无向图的所有生成树数量等于其任意一
个基尔霍夫矩阵的任意一个n-1阶行列式。
基尔霍夫矩阵是无向图的一个矩阵表示,其中每个元素都是该边
的权值或为0。
n-1阶行列式是基尔霍夫矩阵任取n-1行n-1列后所得
矩阵的行列式。
该定理的证明需要用到线性代数中的一些概念和定理,例如矩阵
的行列式性质、伴随矩阵、克拉默法则等。
其中重要的一步是,利用
伴随矩阵计算基尔霍夫矩阵的任意一个n-1阶行列式,将其表示为图
中任意一个割的权值和的乘积。
该定理的证明比较复杂,需要较强的线性代数基础和抽象思维能力。
但是,它为计算无向图生成树数量提供了一种简单而有效的方法,是图论中的一个重要结果。
图论5树
离散数学图论第五节树、有向树、有序树定义连通而不含回路的无向图称为无向树、树。
非循环的连通无向图定理若G=<V,E>为n阶无向图,则下列等价1) G是连通的和非循环的;2) G无自圈,且当v,v’∈V时,皆有唯一一条从v到v’的基本路径;3) G连通,且当v,v’∈V时,e=(v,v’)∈E,G+{e}有唯一的一回路4) G连通,当e∈E 时,G-e是非连通的5) G连通,且n(E)=n-1;6) G是非循环的,且n(E)=n-1定理阶大于1的树至少有两个端点定义每个分支都是树的无向图称为森林定理若森林有n个顶点,m条边和k个分支,则m=n-k定义若树T是无向图G的生成子图,则称T 为G的生成树;T中的边称为树枝,G中不属于T的边称为弦若森林F是无向图G的生成子图,则称F为G的生成森林定理每个无向图都有生成森林,无向图G有生成树当且仅当G连通。
定理设T是连通无向图G=<V,E>的生成树,则在T上添加任一弦e可产生唯一的一个G中只含弦e其余边都是枝的圈。
求连通无向图G的生成树的方法:破圈法、避圈法。
破圈法:找出G的一个回路,删除回路上一条边,此过程一直进行到图中不再含有回路为止。
最后得到的不含回路的连通图就是G的生成树。
例求下图的最小生成树定义设G是无向连通加权图,T为G的生成树,T的所有枝的权之和称为T的权,记为w(T)。
G中权最小的生成树称为G的最小生成树。
1 Kruskal 算法设无向连通图G=<V,E>, G中边e 1,…,e m以按权的递增次序排列,即w(e 1) ≤…≤w(e n)。
第1步:置T为空集,j=1;}不含回路,则第2步:若T∪{ejT←T ∪{e j},转第3步;否则转第3步第3步:j=j+1。
若j≤m,转第2步;否则结束。
上述算法也可用于求一般无向连通图的生成树,只要将各边的权当作1。
也称为避圈法。
2 Prim算法第1步:置T为空集;第2步:在V中任选一个顶点t,令M={t};第3步:在E中选取权尽可能小的边(u,v),其中u∈M,v ∈ V-M,将(u,v)放进T,v放进M;第4步:若M≠V,转第3步;否则结束例求下图的最小生成树例下加权图表示7个城市及架起城市间直接通信线路的预测造价,使给出一个设计方案使得各城市间能够通信且总造价最小定义一个有向图D,若不考虑有向边的方向所得的无向图为无向树,称D为有向树。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>
#include<stdlib.h>
#define MAX 20
#define OVERFLOW -2
typedef char VertexType;
typedef struct ArcNode
{
int adjvex;
struct ArcNode *nextarc;
}ArcNode;
typedef struct VNode
{
VertexType data;
int mark;
ArcNode *firstarc;
}VNode,AdjList[MAX];
typedef struct
{
AdjList vertices;
int vexnum,arcnum;
}ALGraph;
typedef struct Node
{
struct Node *child,*nextsibling;
VertexType data;
}Node,*CSTree;
void Create(ALGraph &G);
int LocateVex(ALGraph G,char v);
void DFSForest(ALGraph &G,CSTree &T);
void DFSTree(ALGraph G,int v,CSTree &T);
int FirstAdjVex(ALGraph G,int v);
int NextAdjVex(ALGraph G,int v,int w);
void Output(CSTree T);
void main()
{
ALGraph G;
CSTree T;
Create(G);
DFSForest(G,T);
printf("\n\n\n\n无向图的生成树的中序遍历:");
Output(T);
printf("\n\n\n\n\n\n\n");
}
void Create(ALGraph &G)
{
int i,j,k,flag1,flag2;
char v1,v2;
ArcNode *p1,*p2,*p3,*p4;
p1=p2=p3=p4=NULL;
printf("请输入顶点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
flushall();
printf("\n\n请输入顶点(字符间不要空格):");
for(i=0;i<G.vexnum;i++)
{
scanf("%c",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
system("cls");
for(k=0;k<G.arcnum;k++)
{
printf("请输入边上的两个顶点(顶点间不要空格):");
flushall();
scanf("%c%c",&v1,&v2);
printf("\n\n");
i=LocateVex(G,v1);
j=LocateVex(G,v2);
p3=(ArcNode *)malloc(sizeof(ArcNode));
if(!p3)
exit(OVERFLOW);
p4=(ArcNode *)malloc(sizeof(ArcNode));
if(!p4)
exit(OVERFLOW);
p3->adjvex=j;
p3->nextarc=NULL;
p4->adjvex=i;
p4->nextarc=NULL;
flag1=flag2=0;
if(G.vertices[i].firstarc)
{
p1=G.vertices[i].firstarc;
flag1=1;
while(p1->nextarc)
p1=p1->nextarc;
}
if(G.vertices[j].firstarc)
{
p2=G.vertices[j].firstarc;
flag2=1;
while(p2->nextarc)
p2=p2->nextarc;
}
if(flag1==0)
G.vertices[i].firstarc=p3;
else
p1->nextarc=p3;
if(flag2==0)
G.vertices[j].firstarc=p4;
else
p2->nextarc=p4;
}
}
int LocateVex(ALGraph G,char v)
{
int i=0;
while(G.vertices[i].data!=v)
i++;
return i;
}
void DFSForest(ALGraph &G,CSTree &T)
{
int v,first=0;
CSTree p,q;
T=NULL;
for(v=0;v<G.vexnum;v++)
G.vertices[v].mark=0;
for(v=0;v<G.vexnum;v++)
{
if(!G.vertices[v].mark)
{
p=(CSTree)malloc(sizeof(Node));
if(!p)
exit(-1);
p->data=G.vertices[v].data;
p->child=p->nextsibling=NULL;
if(!T)
T=p;
else
q->nextsibling=p;
q=p;
DFSTree(G,v,p);
}
}
}
void DFSTree(ALGraph G,int v,CSTree &T)
{
int w,first=0;
CSTree p,q;
G.vertices[v].mark=1;
for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w)) {
if(!G.vertices[v].mark)
{
p=(CSTree)malloc(sizeof(Node));
if(!p)
exit(-1);
p->data=G.vertices[v].data;
p->child=p->nextsibling=NULL;
if(first)
{
T->child=p;
first=1;
}
else
q->nextsibling=p;
q=p;
DFSTree(G,v,q);
}
}
}
int FirstAdjVex(ALGraph G,int v)
{
int w;
if(G.vertices[v].firstarc)
{
w=G.vertices[v].firstarc->adjvex;
return w;
}
return -1;
}
int NextAdjVex(ALGraph G,int v,int w)
{
ArcNode *p;
p=G.vertices[v].firstarc;
while(p->adjvex!=w)
p=p->nextarc;
if(p->nextarc)
return p->nextarc->adjvex;
else
return -1;
}
void Output(CSTree T)
{
if(T)
{
Output(T->child);
printf("%c ",T->data);
Output(T->nextsibling);
}
}。