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

 

转载于:https://www.cnblogs.com/OmegaIota/p/3256044.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值