procedure minspn3(var adjmat,wgtmat:mat; var t : arr); const maxnode = 9 ; type mat = array[1..maxnode,1..maxnode] of integer; arr = array[1..maxnode,1..maxnode] of integer; edge = record node1,node2,weight : integer; end; var i,j : integer; e,v,w : integer; count : integer; l : array[1..100] of edge; eset : array[1..maxnode,0..maxnode] of integer; e_num : integer; function edge_load : integer; var i,j : integer; ecount : integer; begin ecount := 0; for i := 1 to maxnode do for j := i to maxnode do if adjmat[i,j] = 1 then begin ecount := ecount+1; with l[ecount] do begin node1 := i; node2 := j; weight:= wgtmat[i,j]; end; edge_load := ecount; end; end; procedure bubble; var i,j : integer; work : edge; begin for i := edge_load downto 2 do for j := 1 to i-1 do if l[j].weight > l[j+1].weight then begin work := l[j+1]; l[j+1] := l[j]; l[j] := work; end; end; procedure setor (v,w :integer); var i : integer; begin for i := 1 to maxnode do if eset[v,i]=1 then eset[w,i]:=1; eset[v,0] :=0; end; function find_eset (v :integer) : integer; var i,j : integer; begin for i := 1 to maxnode do if eset[i,0]=1 then if eset[i,v]=1 then find_eset :=i; end; procedure init_eset; var i,j : integer; begin for i := 1 to maxnode do begin for j := 0 to maxnode do eset[i,j] := 0; eset[i,0] := 1; end; for i := 1 to maxnode do eset[i,i] :=1; end; function equi (v,w : integer) : boolean; begin equi := (find_eset(v) = find_eset(w)); end; procedure set_equi(v,w : integer); begin setor(find_eset(v),find_eset(w)); end; begin init_eset; bubble; for i :=1 to maxnode do for j :=1 to maxnode do t[i,j] :=0; count :=0; e_num :=0; while count < maxnode-1 do begin e_num := e_num+1; with l[e_num] do if not equi(node1,node2) then begin t[node1,node2] :=1; t[node2,node1] :=1; set_equi(node1,node2); count := count+1; end; end; end;