【数据结构】MST-Prim

 1 var
 2     d,place,a:array[1..10000] of longint;
 3     now,MST,heapsize,i,n,x1,x2,x3,m:integer;
 4    done:array[1..10000] of boolean;
 5     e:array[1..10000,1..10000] of integer;
 6 procedure exchange(x,y:integer);
 7 var
 8     temp:integer;
 9 begin
10     place[a[x]]:=y;
11     place[a[y]]:=x;
12     temp:=a[x];a[x]:=a[y];a[y]:=temp;
13 end;
14 procedure min_heapify(i:integer);
15 var
16     l,r,smaller:integer;
17 begin
18     l:=i shl 1;
19     r:=l+1;
20     smaller:=i;
21     if (d[a[l]]<d[a[smaller]])and(l<=heapsize) then smaller:=l;
22     if (d[a[r]]<d[a[smaller]])and(r<=heapsize) then smaller:=r;
23     if smaller<>i then
24     begin
25         exchange(smaller,i);
26         min_heapify(smaller);
27     end;
28 end;
29 function extract_min:integer;
30 begin
31     extract_min:=a[1];
32     a[1]:=a[heapsize];
33     place[a[1]]:=1;
34     dec(heapsize);
35     min_heapify(1);
36 end;
37 
38 procedure change(k,x:integer);
39 var
40     i:integer;
41 begin
42     i:=k;
43     while (i>1)and(d[a[i shr 1]]>x) do
44     begin
45         exchange(i,i shr 1);
46         i:=i shr 1;
47     end;
48 
49 end;
50 begin
51    assign(input,'mst.in');
52    reset(input);
53    readln(n,m);
54    for i:=1 to m do
55    begin
56       readln(x1,x2,x3);
57       e[x1,x2]:=x3;
58       e[x2,x1]:=x3;
59    end;
60    fillchar(done,sizeof(done),false);
61     for i:=1 to n do d[i]:=maxlongint;
62     d[1]:=0;
63     for i:=1 to n do a[i]:=i;
64     for i:=1 to n do place[i]:=i;
65     heapsize:=n;
66     while heapsize<>0 do
67     begin
68         now:=extract_min;
69         done[now]:=true;
70         for i:=1 to n do if not(done[i])and(e[i,now]<d[i])and(e[i,now]<>0) then
71         begin
72             d[i]:=e[i,now];
73             change(place[i],e[i,now]);
74         end;
75         MST:=MST+d[now];
76     end;
77    writeln(mst);
78    close(input);
79 end.

 

posted @ 2013-08-13 21:19  OmegaIota  阅读(423)  评论(0编辑  收藏  举报