输入一张无向图,指出该图中哪些结点对之间有路。该问题通常采用传递闭包的计算方法。
【输入】
n(顶点数,1≤n≤20)
e(边数,1≤e≤210)
以下e行,每行为有边连接的一对顶点
【输出】
k行,每行两个数,为存在通路的顶点对序号i,j(i<j)
【输入样例】
6
5 1 5 1 6 2 3 4 6 5 6 【输出样例】
1 4
1 5 1 6 2 3 4 5 4 6 5 6 |
program bibao_example;
const
maxv=20;
var
link,longlink:array[1..maxv,1..maxv] of boolean;
v,e,k,i,j:integer;
procedure init;
begin
assign(input,'bibao.in');
reset(input);
assign(output,'bibao.out');
rewrite(output);
fillchar(longlink,sizeof(longlink),0);
fillchar(link,sizeof(link),0);
readln(v);
readln(e);
for k:=1 to e do
begin
readln(i,j);
link[i,j]:=true; {因为没有权,所以有布尔型表示连通关系,能提高运算速度}
link[j,i]:=true;
end;
end;{init}
procedure bibao;
begin
longlink:=link;
for k:=1 to v do {枚举中间顶点}
for i:=1 to v do {枚举所有顶点对}
for j:=1 to v do {计算顶点i和顶点j的连通情况}
longlink[i,j]:=longlink[i,j] or (longlink[i,k] and longlink[k,j]);
end;{bibao}
procedure out;
begin
for i:=1 to v-1 do
for j:=i+1 to v do
if longlink[i,j]
then writeln(i,' ',j);
end;{out}
begin{main}
init;
bibao;
out;
close(input);
close(output);
end.