博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

计算图的连通性

Posted on 2010-10-20 11:01  桃子在路上  阅读(504)  评论(0编辑  收藏  举报

输入一张无向图,指出该图中哪些结点对之间有路。该问题通常采用传递闭包的计算方法。
【输入】
    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.