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

计算最佳连通分支

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

在一张顶点带权的无向图中,计算含顶点数最多的一个连通分支和顶点权和最大的连通分支。
【输入】
    n(顶点数,1≤n≤20)
    以下n行,其中第i行是顶点i的权
    e(边数,1≤e≤210)
    以下e行,每行为有边连接的一对顶点
【输出】
    含顶点数最多的一个连通分支
    顶点权和最大的一个连通分支
 

【输入样例】
6
2
10
20
8
5
7
5
1 5
1 6
2 3
4 6
5 6
 
【输出样例】
1->5->6->4->
2->3->
                      
 

program liantong_example;
const
  maxv=20;
var
  link,longlink:array[1..maxv,1..maxv] of boolean;
  f:array[1..maxv] of boolean;
  w:array[1..maxv] of integer;
  v,e,k,i,j,s,best,besti,max,maxk:integer;
procedure init;
  begin
   assign(input,'liantong.in');
   reset(input);
   assign(output,'liantong.out');
   rewrite(output);
   fillchar(longlink,sizeof(longlink),0);
   fillchar(link,sizeof(link),0);
   readln(v);
   for i:=1 to v do
     readln(w[i]);
   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
        longlink[i,j]:=longlink[i,j] or (longlink[i,k] and longlink[k,j]);
  end;{bibao}
procedure dfs(i:integer);         {深度优先搜索,用于输出路径}
  begin
    write(i,'->');
    f[i]:=true;
    for j:=1 to v do
      if (not f[j]) and longlink[i,j]
         then dfs(j);
  end;{dfs}
begin{main}
  init;
  bibao;
  for i:=1 to v do
    begin
      k:=0;s:=0;
      for j:=1 to v do          {计算顶点i所在连通分支中的顶点总数和顶点的权和}
        if longlink[i,j]
          then begin
                 k:=k+1;
                 s:=s+w[j];
               end;
        if k>best                {求出顶点数的最大值}
            then begin
                   best:=k;
                   besti:=i;
                 end;
        if s>max                 {求出顶点权和的最大值}
            then begin
                   max:=s;
                   maxk:=i;
                 end;
        if k=v then break;
      end;
   fillchar(f,sizeof(f),false);  {结点是否访问数组初始化}
   dfs(besti);
   writeln;
   fillchar(f,sizeof(f),false);
   dfs(maxk);
  close(input);
  close(output);
end.