1、实验三:图的连通性判断一、实验目的用计算机语言编写图的连通性判断算法,可输入图的邻接矩阵,判断图是否连通以及确定连通分支的个数,掌握 Warshell 算法或矩阵幂算法的实现方法。二、实验原理1、Warshell 算法Warshell 算法可解决图是否连通的问题, 而且效率很高。在该算法中,矩阵 是判断矩阵, 表示从 到 连通, 表示从 到 不连通。P1ijpij0ijpij(1)置新矩阵 P:= C;(2)置 = 1; i(3)对所有的 ,若 , 则对 k=1,2,n, 有 ;j)(ij ),(),(:),(kipjkj(4) ;i(5) 如 转向步骤(3), 否则停止。n2、矩阵幂算法由于
2、邻接阵包含了图的所有信息,和关联阵一样,是图的等价表示。可以通过对邻接阵 C 做一些计算,得到图 G 的一些性质。例如考虑 中的 的3C),(ji元素 ,如果它不为零,由于 ,则至少存在一组)3(,jickjlkiji ccl,)3(,或一个长度为 3 的链使端 和端 相连。从而,通过计算 C 的1, jllki各阶幂次可得到关于图是否连通的信息。三、实验内容1.利用 MATLAB 等语言实现图的连通性判断算法,可对输入的邻接阵进行连通性以及连通分支数的判断。2.比较 Warshell 算法和矩阵幂算法在算法正确性和算法复杂度上的区别。3.对算法进行优化。四、采用的语言MatLab 源代码:c
3、lear,clc;%输入邻接矩阵disp(图的连通性以及连通分支数的判断);C = input(请输入图的邻接矩阵( 格式如:1 1 0;1 1 1;0 1 1) C=);%矩阵幂算法n=size(C,1);%邻接矩阵阶数P=zeros(n,n);%构造连通矩阵 Pk=1;for k=1:n %计算矩阵幂的和C1=Ck;P = P + C1;endS=n-rank(P);%连通分支数为 0 特征值个数%Warshell 算法S1=0;a=1;G=zeros(n,1);for i=1:nfor j=(i+1):nif C(i,j)=1%若两端之间有边连通if G(i)=G(j)%若两端之间有连通
4、链,说明二者在同一连通分支if G(i)=0G(i)=a;G(j)=a;a=a+1;S1=S1+1;endelseif G(i)=0G(i)=G(j);%若与 i 不连通,则与 j 在同一连通分支elseif G(j)=0G(j)=G(i);%若与 j 不连通,则与 i 在同一连通分支else%若两端相连通,但标记在不同连通分支,合并两连通分支for b=1:nif G(b)=G(i)G(b)=G(j);%合并两连通分支endendS1=S1-1;%合并两连通分支endend endendend%输出结果Cif S=1disp(矩阵幂算法:连通);elsedisp(矩阵幂算法 :不连通,连通分
5、支数 =,num2str(S);endif S1=1disp(Warshell 算法:连通 );elsedisp(Warshell 算法:不连通,连通分支数=,num2str(S1);end五、数据结构1.主要函数输入函数:C = input(输入图的邻接矩阵C=);矩阵幂算法:n=size(C,1);%邻接矩阵阶数P=zeros(n,n);%连通矩阵Pk=1;for k=1:n %计算矩阵幂的和C1=Ck;P = P + C1;endS=n-rank(P);%连通分支数为0特征值个数Warshell算法:S1=0;a=1;G=zeros(n,1);for i=1:nfor j=(i+1):n
6、if C(i,j)=1%若两端之间有边连通if G(i)=G(j)%若两端之间有连通链,说明二者在同一连通分支if G(i)=0G(i)=a;G(j)=a;a=a+1;S1=S1+1;endelseif G(i)=0G(i)=G(j);%若与i 不连通,则与j在同一连通分支elseif G(j)=0G(j)=G(i);%若与j 不连通,则与i在同一连通分支else%若两端相连通,但标记在不同连通分支,合并两连通分支for b=1:nif G(b)=G(i)G(b)=G(j);%合并两连通分支endendS1=S1-1;% 合并两连通分支endend endendend输出函数:Cif S=1d
7、isp(矩阵幂算法:连通);elsedisp(矩阵幂算法:不连通,连通分支数=,num2str(S);endif S1=1disp(Warshell算法:连通 );elsedisp(Warshell算法:不连通,连通分支数=,num2str(S1);end2. 算法的流程图矩阵幂算法:C1=CkP=P+C1k=k+1得到 C 的阶数 nk=1开始输入邻接矩阵 Ck=n?连通分支数S=n-连通矩阵P的秩结束Warshell算法:NoYesi+若 p(j,i)=1p(i,j)=p(i,k)+*p(k,j)j+i=1,j=1输入邻接矩阵 C得到 C 的阶数 n边数 mk=1开始i=n?j=i?Yes
8、NoYesNo结束连通分支数S六、实验结论与分析Warshell 算法和矩阵幂算法在算法正确性基本相同,算法复杂度上矩阵幂算法比 Warshell 算法复杂的多。矩阵幂算法复杂度为 O(nn)Warshell 算法复杂度为 O(n3)七、遇到的问题及解决方法在编程初期,对两种算法的理解不够,在编程时无从下手,复习课本后并在网上查找了相关资料,对两种算法的核心有了较深的理解,编程时就没有问题了。八、实验心得通过本次实验实现了用计算机语言编写图的连通性判断算法,基本掌握了矩阵幂算法和 Warshell 算法的实现方法,对 MatLab 编程语言更加熟悉,培养了算法设计与优化能力。此次实验我受益匪浅。