关于最小生成树的 prim 算法

      前几天,算法的大概思路大概还是清楚了,就是不知道实现,唉,补作业去了,今天晚上弄了下,没什么头绪,于是先看了百度百科里的程序。

一开始还是搞不懂,后面应该大概明白了,

这是一个 样例数据,储存的方式是邻接矩阵。

          (0,6,1,5,0,0),
         (6,0,5,0,3,0),
         (1,5,0,5,6,4),
         (5,0,5,0,0,2),
         (0,3,6,0,0,6),
         (0,0,4,2,6,0);
prim 算法的大概思路是 一开始随便选一个点,找到与之相邻的最小权值,用数组f记录最小,百度百科里的意思大概就是这样了,貌似和向总讲的不一样,为什么他说要用到插入排序,或者用堆优化,可能有其他的实现方法,目前还没想出来。
 1 program self_prim;
 2 const map:array [1..6,1..6] of integer=((0,6,1,5,0,0),
 3         (6,0,5,0,3,0),
 4         (1,5,0,5,6,4),
 5         (5,0,5,0,0,2),
 6         (0,3,6,0,0,6),
 7         (0,0,4,2,6,0));
 8 var
 9         i,j,k,l,m,n,min,minn:longint;
10         u,v:set of 1..6;
11         s:array[1..3,1..6]of longint;
12         f:array[1..6]of longint;
13         d:array[1..6]of longint;
14 
15         begin
16         u:=[ ];
17         v:=[ ];
18         for i:=1 to 6 do
19                 f[i]:=1000;
20         for i:=2 to 6 do
21                 v:=v+[i];
22         l:=1;
23         for i:=1 to 5 do
24                 begin
25                 min:=1000;
26                 for j:=1 to 6 do
27                         begin
28                                 if(map[l,j]<>0)and(map[l,j]<f[j])and(j in v) then
29                                         begin
30                                         d[j]:=l; f[j]:=map[l,j];
31                                         end;
32                                 if(f[j]<min)and(f[j]<>0) then
33                                         begin
34                                         min:=f[j];
35                                         minn:=j;
36                                         end;
37                         end;
38                 f[minn]:=0;
39                 v:=v-[minn];
40                 s[1,i]:=d[minn];
41                 s[2,i]:=minn;
42                 s[3,i]:=min;
43                 l:=minn;
44                 writeln(s[1,i],' to ',s[2,i],' = ',s[3,i]);
45                 end;
46 end.  
posted @ 2012-10-19 20:21  改名字干什么  阅读(229)  评论(0编辑  收藏  举报