关于最小生成树的 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.