首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 计算机考试 > 软件考试 > 复习指导 >

最小生成树的算法实现

2009-02-15 
学数据结构免不了要遇到最小生成树的问题,下面我们就介绍最小生成树的算法实现。

  A.Prim算法:
  procedure prim(v0:integer);
  var
  lowcost,closest:array[1..maxn] of integer;
  i,j,k,min:integer;
  begin
  for i:=1 to n do begin
  lowcost[i]:=cost[v0,i];
  closest[i]:=v0;
  end;
  for i:=1 to n-1 do begin
  {寻找离生成树最近的未加入顶点k}
  min:=maxlongint;
  for j:=1 to n do
  if (lowcost[j]<min) and (lowcost[j]<>0) then begin
  min:=lowcost[j];
  k:=j;
  end;
  lowcost[k]:=0; {将顶点k加入生成树}
  {生成树中增加一条新的边k到closest[k]}
  {修正各点的lowcost和closest值}
  for j:=1 to n do
  ifcost[k,j]<lwocost[j] then begin
  lowcost[j]:=cost[k,j];
  closest[j]:=k;
  end;
  end;
  end;{prim}
  B.Kruskal算法:(贪心)
  按权值递增顺序删去图中的边,若不形成回路则将此边加入最小生成树。
  function find(v:integer):integer; {返回顶点v所在的集合}
  var i:integer;
  begin
  i:=1;
  while (i<=n) and (not v in vset[i]) do inc(i);
  if i<=n then find:=i else find:=0;
  end;
  procedure kruskal;
  var
  tot,i,j:integer;
  begin
  for i:=1 to n do vset[i]:=[i];{初始化定义n个集合,第I个集合包含一个元素I}
  p:=n-1; q:=1; tot:=0; {p为尚待加入的边数,q为边集指针}
  sort;
  {对所有边按权值递增排序,存于e[I]中,e[I].v1与e[I].v2为边I所连接的两个顶点的序号,e[I].len为第I条边的长度}
  while p>0 do begin
  i:=find(e[q].v1);j:=find(e[q].v2);
  if i<>j then begin
  inc(tot,e[q].len);
  vset[i]:=vset[i]+vset[j];vset[j]:=[];
  dec(p);
  end;
  inc(q);
  end;
  writeln(tot);
  end;

 

3COME考试频道为您精心整理,希望对您有所帮助,更多信息在http://www.reader8.com/exam/

热点排行