【数据结构】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.