关于Prim算法求最小支撑树的问题!!!(200分)

  • 主题发起人 主题发起人 一生骄傲
  • 开始时间 开始时间

一生骄傲

Unregistered / Unconfirmed
GUEST, unregistred user!
哪位大侠能够给出delphi版的Prim算法求解最小支撑树的代码?小弟有一问题急需,望不吝赐教。一定要Prim算法的,我看过以前的帖子,好像只有Kruskal算法的。
 
http://algorithm.myrice.com/resources/code_center/algorithm/graph_lib/graph_lib_pas.htm
图论算法库 Pascal语言实现
代码内容 图论算法库,包括以下算法:
单源最短路径 Dijkstra 算法
单源最短路径 Bellman-Ford 算法
最小生成树 Prim 算法
每对节点间最短路径 Flod-Warshall 算法
求有向图的传递闭包算法
深度优先搜索,找出关于图的结构的信息
最大流算法 基于Ford-Fulkerson 算法的 Edmonds-Karp 实现
容量有上下界的最大流问题

语言 Pascal

编译平台 Borland Delphi 5.0

作者 starfish (starfish.h@china.com)

下载 图论算法库Pascal实现(WinZip压缩包,31.8KB)

备注 程序用pascal语言编写,在Borland Delphi 5.0下调试通过。压缩包内的Graph.lib文件包含所有的库函数,其调用接口见程序内注释。其他的文件是用来测试算法的测试程序,在delphi5.0下编译运行。
该算法是我为参加ACM/ICPC竞赛而准备的资料,由于竞赛的对编程速度要求较高,所以为了将代码写的短一点,为了便于调试,代码的写的并不是最优的。
虽然该代码在Delphi下写成,但是很容易将其移植到Turbo Pascal上。

:),一般人我不告诉他,看好了就给我加分啊
 
看看先,搞定马上给分!
 
program Prim;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
MaxN = 100;
var
Graph: array [1..MaxN, 1..MaxN] of Integer;
Mark: array [1..MaxN] of Boolean;
n: Integer;
BestLen: Integer;
BestS, BestD: Integer;
i, j, k: Integer;
procedure ReadGraph;
var
i, j: Integer;
begin
Write('Input num of v: ');
ReadLn(n);
for i:=1 to n-1do
begin
Graph[i, i]:=0;
for j:=i+1 to ndo
begin
Write('Input the length between v', i, ' and v', j, ': ');
ReadLn(Graph[i, j]);
Graph[j, i]:=Graph[i, j]
end
end
end;

begin
ReadGraph;
FillChar(Mark, SizeOf(Mark), 0);
Mark[1]:=True;
for k:=1 to n-1do
begin
BestLen:=MaxInt;
for i:=1 to ndo
if Mark then
for j:=1 to ndo
if (not Mark[j]) and (Graph[i, j]>0) and (Graph[i, j]<BestLen) then
begin
BestLen:=Graph[i, j];
BestS:=i;
BestD:=j
end;
Mark[BestD]:=True;
WriteLn(BestS, ' ', BestD)
end;
ReadLn
end.
 
对于这个问题还有一个小小的限制:不一定是从编号为1的点开始,也就是说,我可以选择图中的任意点为起点,然后计算。因为从不同的起点出发,得出的spanngingtree是不同的。请两位再帮我改一下,谢谢!
 
看见Mark[1]:=True;这句话了吗?其中的1就是起点,想从第几个起点开始,就用几把1换掉。
 
别急,正在调试中,正确后立即给分。
 
还有一个小问题:是不是Kruskal和Prim算法算的结果不同?Prim算法中,从不同的起点出发,所得的结果是不是也是不同的??
 
就是从同一个起点出发,也可能得到不同的结果。
如果可选边中有两条的长度一样,不同的选法就会产生不同的结果。
 
多人接受答案了。
 
后退
顶部