使用并查集
1 var 2 x1,x2,x3,n,m,i,j,mst:integer; 3 head,tail,u,p:array[1..1000] of integer; 4 procedure qsort(l,r:integer); 5 var 6 i,j,mid,temp:integer; 7 begin 8 i:=l;j:=r;mid:=(l+r) shr 1; 9 repeat 10 while u[i]<u[mid] do inc(i); 11 while u[j]>u[mid] do dec(j); 12 if i<=j then 13 begin 14 temp:=head[i];head[i]:=head[j];head[j]:=temp; 15 temp:=tail[i];tail[i]:=tail[j];tail[j]:=temp; 16 temp:=u[i];u[i]:=u[j];u[j]:=temp; 17 inc(i);dec(j); 18 end; 19 until i>j; 20 if l<j then qsort(l,j); 21 if i<r then qsort(i,r); 22 end; 23 function find(k:integer):integer; 24 var 25 i:integer; 26 begin 27 if p[k]=k then exit(k); 28 p[k]:=find(p[k]); 29 exit(p[k]); 30 end; 31 32 procedure union(a,b:integer); 33 var 34 i,x1,x2:integer; 35 begin 36 x1:=p[a]; 37 x2:=p[b]; 38 p[x1]:=x2; 39 end; 40 begin 41 assign(input,'mst.in'); 42 reset(input); 43 readln(n,m); 44 for i:=1 to m do 45 begin 46 readln(x1,x2,x3); 47 head[i]:=x1;tail[i]:=x2;u[i]:=x3; 48 end; 49 close(input); 50 for i:=1 to n do p[i]:=i; 51 qsort(1,m); 52 for i:=1 to m do 53 writeln(head[i],',',tail[i],':',u[i]); 54 for i:=1 to m do 55 begin 56 if find(head[i])<>find(tail[i]) then 57 begin 58 union(head[i],tail[i]); 59 MST:=MST+u[i]; 60 end; 61 end; 62 writeln(mst); 63 end.