三、邻接矩阵及其应用是我们在图论部分遇到的第三个难点。
1.邻接矩阵的定义
邻接矩阵的初始矩阵中的每个元素是顶点 vi 邻接到顶点 vj 边的条数。切记这是vi到vj直接的边,不是通路。
2.邻接矩阵的应用
这个才是重点。
图中长度为L的通路的条数,可以由图的邻接矩阵的L次方求得。邻接矩阵的L次方,就是邻接矩阵的L-1次方乘以邻接矩阵。
将邻接矩阵的L次方中所有的元素相加,就是长度为L的通路条数;将其所有对角线的元素相加,就是长度为L的回路条数。
例 有向图D如图所示,求 A, A2, A3, A4,并回答诸问题:
(1) D 中长度为1, 2, 3, 4的通路各有多少条?其中回路分别为多少条?
(2) D 中长度小于或等于4的通路为多少条?其中有多少条回路?
(1) D中长度为1的通路为1+2+1+1+1+1+1=8条,其中有1条是回路.
D中长度为2的通路为1+3+2+2+1+1+1=11条,其中有3条是回路.
D中长度为3和4的通路分别为1+4+3+3+1+1+1=14和 1+5+4+4+1+1+1=17条,回路分别为1与3条.
(2) D中长度小于等于4的通路为50条,其中有8条是回路.
四、可图化与可简单图化是我们在图论部分遇到的第四个难点。
1.相关定义
V={v1, v2, …, vn}为无向图G的顶点集,称d(v1), d(v2), …, d(vn)为G的度数列
V={v1, v2, …, vn}为有向图D的顶点集,
D的度数列:d(v1), d(v2), …, d(vn)
D的出度列:d+(v1), d+(v2), …, d+(vn)
D的入度列:d-(v1), d-(v2), …, d-(vn)
结点的度数,就是与结点相关联的边的条数。一条边提供两个度,普通边将两个度提供给不同的两个结点,自回路将两个度提供给同一个结点。
上图中v1,v2,v3,v4,v5的度分别是44,2,1,3。
我们将度数看成一个数字序列,则(4,4,2,1,3)称为度数列。问题是,是不是所有的数字序列可以作为结点的度数,进而画出图呢?
不是的。只有满足条件的数字序列才可以作为图中结点的度。
如果一个非负整数列d=(d1, d2, …, dn)可以画成图,则称其是可图化的;如果一个非负整数列d=(d1, d2, …, dn)可以画成简单图,则称其是可简单图化的。
2.可图化
如果一个数字序列可图化,根据握手定理,
则所有结点的度数之和应该是2m,是偶数,所以,数字序列可图化的充要条件是:所有数字之和是偶数。
3.可简单图化
简单图是无自回路、无多重边的图。一个数字序列是否可简单图化,没有充分条件,只有必要条件:图的最大度<=n-1,n是图中结点的个数。
易知:
(1, 2, 3, 4, 5),(3, 3, 3, 4) 都不是可图化的,也不是可简单图化的。
(2, 4, 6, 8, 10),(1, 3, 3, 3, 4) 是可图化的,其中,(1, 1,1, 2, 3)的最大度是3,小于等于5-1=4,又是可简单图化的。
当图的最大度=n-1时,处于临界值,这时需要去具体分析一下,是不是可简单图化。
比如(1,3,3,3)满足可简单图化的必要条件。假设v2、v3、v4的度数均为3,v1是度数为1的结点,连接到v2。根据简单图的定义,没有自回路,没有多重边,则v2的另外两个度必然一个连接v3,一个连接v4。此时,v3的度也要为3,是不可能的,v3只能有一条连接到v4的边。否则就会有多重边出现。故(1,3,3,3)可图化,但不可简单图化。
五、最小生成树是我们在图论部分遇到的第五个难点。
生成树——生成子图并且是树。
生成这两个字,表示结点一个都不能少,边可以去掉一些;
树这个概念,用五个字来说,就是“连通无回路”;
那么,最小生成树的最小,体现在哪里呢?
最小,指的是树的权最小。图中每条边都有权,一般用一个非负整数来表示,可以认为是两点间的距离、所耗费的时间等,权用英文单词weight来表示。
上图中,v1和v2两个顶点之间有两条边,一条边的权为1,另一条边的权为2。我们可以理解为v1和v2两个顶点之间,通过第一条边需要用1个小时,通过第二条边需要用2个小时。当然,自回路也可以有权,比如图中v3顶点有自回路,自回路的权为1。
对于一个图来说,它的生成树可能会有好多个。比如我们现在看到的这样的生成树,生成树中的每条边都叫树枝,所有的树枝的权之和,称之为树的权。比如说,目前这棵生成树的权是1+7+2+3+3+5+18=39,下面的这一棵生成树,它的权是2+8+3+4+18+3+4=42。这样的话,我们有的同学已经可以自己来定义最小生成树的概念了。所谓的最小生成树,就是在一个图的所有的生成树当中,找一棵权最小的生成树。
定义 T是G=的生成树
(1) W(T)——T各边权之和
(2) 最小生成树——G的所有生成树中权最小的树。
那么现在,如何去求一棵树的最小生成树呢?目前有两种成熟的算法。一种叫Kruskal(克鲁斯卡尔)算法,也叫避圈法;另一种叫Prim(普里姆)算法。现在我们来看一下避圈法。
避圈法求最小生成树
首先要将图中所有非环边按照权值从小到大排列,编号依次记为e1,e2,e3,……,em,当然在这个排序当中,我们允许有边的权值相同的情况出现。
第一步,取e1在最小生成树T当中。
第二步,检查e2,是否与e1构成回路。如果有回路出现,则舍弃e2;如果没有回路出现,则把e2也取在树T当中。
第三步,检查e3,看e3是否与e1 e2形成回路。如果有回路出现,则舍弃e3;如果没有回路出现,则把e3也取在树T当中。如此重复,直到得到最小生成树为止。
下面对图G来求最小生成树。
首先,要剔除掉图中的自回路。
然后将其余的边按照权值从小到大排序。2,2,3,3,5,18。
第一步,取权为2的边在树T当中。接着检查另一条权为2的边,没有回路,加入生成树。再检查权为3的两条边,一条与权为2的边形成回路,舍弃;另一条权为3的边没有回路,加入树T。再检查权为5的两条边,有回路出现,舍弃。目前,剩下了最后一条权为18的边,权很大,要不要呢?当然要!因为如果没有这一条边,我们之前纳入进来的所有的边就不是连通的,也就不能称之为树了。这样,我们就得到了这个图的最小生成树,最小生成树的权W(T)=2+2+3+18=25.
六、最优二叉树是我们在图论部分遇到的第六个难点。
求最优树的算法—— Huffman算法
给定实数w1, w2, …, wt,且w1<=w2<=…<=wt.
(1) 连接权为w1, w2的两片树叶,得一个分支点,其权为w1+w2.
(2) 在w1+w2, w3, …, wt 中选出两个最小的权,连接它们对应的顶点(不一定是树叶),得新分支点及所带的权.
(3) 重复(2),直到形成 t-1个分支点,t片树叶为止.
一棵2叉树产生一个二元前缀码.
一棵正则2叉树产生惟一的前缀码(按左子树标0,右子树标1)
图所示二叉树产生的前缀码为
{ 00, 10, 11, 011, 0100, 0101 }
例 在通信中,八进制数字出现的频率如下:
0:25% 1:20%
2:15% 3:10%
4:10% 5:10%
6:5% 7:5%
求传输它们的最佳前缀码,并求传输10的n次方(n>=2)个按上述比例出现的八进制数字需要多少个二进制数字?若用等长的(长为3)的码字传输需要多少个二进制数字?
解 用100个八进制数字中各数字出现的个数,即以100乘各频率为权,并将各权由小到大排列,得w1=5, w2=5, w3=10, w4=10, w5=10, w6=15, w7=20, w8=25. 用此权产生的最优树如图所示.
01-----0 11-----1
001-----2 100-----3
101-----4 0001-----5
00000-----6 00001-----7
W(T)=285,即传100个以上述频率传输的数字需要285个二进制数,那么传10的n次方(n>=2)个用二进制数字需2.85*10的n次方个, 用等长码需3*10的n次方个数字.
注意:最小生成树和最优二叉树都不一定唯一,当其不唯一的时候,它们的权都是一致的。