【题17】计算连通性问题--试题解析
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
【题17】计算连通性问题
输入一张无向图,指出该图中哪些顶点对之间有路。
输入:
n (顶点数,1≤n ≤20)
e (边数1≤e ≤210)
以下e 行,每行为有边连接的一对顶点
输出:
k 行,每行两个数,为存在通路的顶点对序号i 、j(i 分析: 在一张图中,如何判别任两个顶点之间是否有路,我们通常采用传递闭包的计算方法。设 var link ,longlink :array[1..20,1..20] of boolean ;{ 无向图和无向图的传递闭包。其中 无路 至有路至j i j i false true j i longlink ⎩⎨⎧=],[} 我们递推产生longlink (0)、longlink (1)、…longlink (n)。在递推过程中,路径长度的’+’运算和比较大小的运算用相应的逻辑运算符’and’和’or’代替。对于i ,j 和k=1‥n ,如果图中结点i 至结点j 间存在通路且通路上所有结点的序号均属于{1‥k},则定义longlink ij (k)=1;否则longlink ij (k)=0。 longlink ij (k)=longlink ij (k-1) or (longlink ik (k-1) and longlink kj (k-1)) 由于布尔值的存储量少于整数且位逻辑运算的执行速度快于算术运算,因此后者无论在时间和空间上都优于前一种算法。传递闭包longlink 的计算过程如下: longlink ←link ; for k ←1 to n do {枚举中间顶点} for i ←1 to n do {枚举所有顶点对} for j ←1 to n do {计算顶点i 和顶点j 的连通情况} longlink[i ,j]←longlink[i ,j] or (longlink[i ,k]and longlink[k ,j]); 显然,计算传递闭包的时间复杂度为W(n 3)。由此得出主程序 fillchar(longlink ,sizeof(longlink),0); {传递闭包初始化} fillchar(link ,sizeof(link),0); {无向图初始化} readln(n);readln(e); {读顶点数和边数} for k ←1 to e do {输入无向图的信息} begin readln(i ,j);link[i ,j]←true ;link[j ,i]←true ; end ;{for} 计算传递闭包longlink ; for i ←1 to n-1 do {输出所有存在通路的顶点对} for j ←i+1 to n do if longlink[i ,j] then 输出i 和j ; 在实际生活中,计算传递闭包方法很有应用价值。