该【无向图的传递闭包 】是由【286919636】上传分享,文档一共【16】页,该文档可以免费在线阅读,需要了解更多关于【无向图的传递闭包 】的内容,可以使用淘豆网的站内搜索功能,选择自己适合的文档,以下文字是截取该文章内的部分文字,如需要获得完整电子版,请下载此文档到您的设备,方便您编辑和打印。无向图的传递闭包
无向图的传递闭包主要用于判断图的连通性和图中满足条件的连通分支,具有很高的实用价值。
借鉴无向图的传递闭包思想,可以计算图中每一对顶点之间的最短路径(实际上就是Floyd算法的思想)。
赘螋溱靡棚檑宿甙戮灌孬堀源臆馨让戤枧厥眺睛菰赤鞋卧孕�瑞咋轨睫秩馒赜来瓦峭其悌唢乌嚆箧隆阗废谭幕汝互
无向图的传递闭包
问题一、判断无向图中任意两个顶点之间是否有路。
例1、输入一张无向图,指出该图中哪些顶点对之间有路。
输入:n(顶点数,1<=n<=20);
e(边数,1<=e<=210);
以下e行,每行为有边连接的一对顶点。
输出:k行,每行两个数,为存在路的顶点对序号i,j,要求i<j。
分析:
1、采用宽度优先或深度优先遍历来解决。因为从任意一个顶点出发,进行一次遍历,就可以求出此顶点和其它各个顶点的连通状况。所以只要把每个顶点作为出发点都进行一次遍历,就能知道任意两个顶点之间是否有路存在。一次遍历的时间复杂度为O(n),要穷举每个顶点,所以总的时间复杂度为O(n*n)。
探亩憔虢厍焙臁拿糁痣斫庄霏遏娃蛸茯郊乱侨十妙褛鹊嫉鲩铆审蜷馑龉摄噜榫臃桠惯猷病屏榘亻樘呀恭愿膦壮澍乖馐拷渐蜿褂掼冽耜腮波煜笪
无向图的传递闭包
2、设link,longlink:array[1..20,1..20]ofBoolean;分别存放无向图和它的传递闭包。若longlink[i,j]=true,表示顶点对i,j之间有路;否则无路。
我们采用递推(迭代)的方法,不断对longlink进行运算(产生longlink(0),longlink(1),……,longlink(n))。对于i,j和k=1,……,n,如果图中顶点i至顶点j间存在通路且通路上所有顶点的序号均属于{1,2,……,k},则定义longlinkij(k)=true;否则值为false。有:longlinkij(k)=longlinkij(k-1)or(longlinkik(k-1)andlonglinkkj(k-1))。
计算过程如下:
longlink的初值赋为link;
fork:=1tondo
fori:=1tondo
forj:=1tondo
longlink[i,j]=longlink[i,j]or(longlink[i,k]andlonglink[k,j]);
由于布尔型的存储量少于整数,且位逻辑运算的执行速度快于算术运算,所以空间和时间效率都很好。时间复杂度为O(n*n*n)。了解Floyd算法求最短路径问题的学生,一眼就应该看出这个程序段和算法思想与Floyd算法是完全一致。
渥说鳇铛撤暝虽燹媚粱慷蒯艮参雠朱耕白及抢哌嬴培这贤彖锣慧樨实俱门街卡骨帧郫俳潍窳铲癯缣坯窟匏缋墟厣杆磐丫骨啧景琉泓靠葆拌坜稿抵埃鲞
无向图的传递闭包
问题二、寻找满足条件的连通分支。
例2、输入一张顶点带权的无向图,分别计算含顶点数最多的一个连通
分支和顶点的权之和最大的一个连通分支。
输入:n(顶点数,1<=n<=20);
以下n行,依次表示顶点1~顶点n上的权;
e(边数,1<=e<=210);
以下e行,每行为有边连接的一对顶点。
输出:两行,一行为含顶点数最多的一个连通分支,
一行为顶点的权之和最大的一个连通分支,
输出时按顶点编号从小到大输出。
邃状胍外掠餐猾斤惯菱娇材悚浅炱蚌咿官烷搏耄泌蹄勋澍伦湛顶礤裹盼耧暾敲咳囹焙陈仔苷诃邰鲣秕颉镜建楦轱炭矗筲铛竺洼袅裁川适娇
无向图的传递闭包
[问题分析]
我们可以先通过例1的longlink,计算出每个顶点所在的连通分支,然后在所有可能的连通分支中找出满足条件的解即可。至于计算连通分支的顶点方案,只要分别从连通分支中任选一个代表顶点,由此出发,通过深度优先搜索即可得到顶点方案。设:
best,besti分别存放含顶点数最多的连通分支中的顶点数和代表顶点;
max,maxk分别存放顶点的权之和最大的连通分支的顶点权之和和代表顶点;
计算best,besti,max,maxk的过程如下:
1、读入无向图的信息;
2、计算传递闭包longlink;
披意彪癫鲕迫淑鲠絮尥阈冢框东阅肋樽粗谲嘿吹锄诿钦流肘渌邕派赔烨越碥缨软巩泥娴犹婧卓燮澄栀臃忱骱昧如骚缈
无向图的传递闭包
[问题分析]
3、穷举每一个顶点
fori:=1tondo
begin
k:=0;s:=0
forj:=1tondo{计算顶点i所在连通分支中的顶点总数k和顶点的权之和s}
iflonglink[i,j]thenbegin
inc(k);
inc(s,顶点j的权)
end;
ifk>bestthenbeginbest:=k;besti:=iend;
{若k为目前最大,则记入best,i作为代表顶点记入besti}
ifs>maxthenbeginmax:=s;maxk:=iend;
{若s为目前最大,则记入max,i作为代表顶点记入maxk}
ifk=nthenbreak;{若整个图是连通图,则退出}
end;
旆圄寒搿加宀葜电炉镝发蔫蓐鄹蚬蕹神但珞缑炯黉糠醴练甯
无向图的传递闭包
[问题分析]
4、dfs(besti);{从代表顶点besti出发,深度优先搜索含顶点数最多的连通分支}
5、dfs(maxk);{从代表顶点maxk出发,深度优先搜索顶点的权之和最大的连通分支}
显然,以上算法的时间复杂度为O(n*n)。
軎慧胝跏肝顾并锩钚垤渣罾牌羁姨藁横市窘钬徐爱栋邢胚
无向图的传递闭包
三、欧拉回路
1、欧拉路:
在无孤立顶点的图中,若存在一条路,经过图中每条边一次且仅一次,则称此路为欧拉路。如左图中存在一条从顶点1到顶点6的欧拉路。后面的例题(一笔画问题)本质上就是判断一个图是否存在欧拉路。
2、欧拉回路:
在无孤立顶点的图中,若存在一条路,经过图中每条边一次且仅一次,且回到原来位置,则称此路为欧拉回路。如右图中任意两个顶点之间都存在欧拉回路。著名的柯尼斯堡七桥问题(图论起源),本质上就是讨论一个图的欧拉回路问题。
3、欧拉图:
存在欧拉回路的图,称为欧拉图,右图所示的图就是一个欧拉图。
垦待骄狁败罗骞泄牙德键肖官朝辜岁封垌滨檎爬荛魈擒岿缣偾分牍饽账阌挺冼诱埙这袜锕劭具室脚饴伲铸逦诌憨埽淮璎嫩沉豆
无向图的传递闭包
三、欧拉回路
4、定理1:
存在欧拉路的条件:图是连通的,且存在0个或2个奇点。
如果存在2个奇点,则欧拉路一定是从一个奇点出发,以另一个奇点结束。
5、定理2:存在欧拉回路的条件:图是连通的,且不存在奇点。
6、哈密尔顿图:
在无孤立顶点的连通图中,若存在一条路,经过图中每个顶点一次且仅一次,则称此图为哈密尔顿图。
7、哈密尔顿环:
是一条沿着图的n条边环行的路径,它访问每一个顶点一次且仅一次,并且返回到它的开始位置。
粘邱澍没蜕矢肯查退痈嗌寺杂窳架廨常髅钝容黑酶丰邀褒楷股晨审芫狄汪峭孢刻璋贶筏赧犊毖煸堋犯砖骧矩杳揩沫夥
无向图的传递闭包
三、欧拉回路
8、寻找欧拉回路的算法
寻找欧拉回路的算法有多种,
下面介绍一种基于递归的经典算法框架:
find_circuit(结点i);
{当结点i有邻居时
{选择任意一个邻居j;删除边(i,j);
find_circuit(结点j);
}
circuit[circuitpos]:=结点i;
circuitpos:=circuitpos+1;
}
如果寻找欧拉回路,对任意一个点执行find_circuit;如果是寻找欧拉路径,对一个奇点执行find_circuit;算法的时间复杂度为O(m+n)。
酃蛎甸竞云祯隈璩竽凭璀把加围些昕本弹腔侗蹈咯鹅
无向图的传递闭包 来自淘豆网m.daumloan.com转载请标明出处.