function find(v: Integer): Integer; {返回顶点v所在的集合} var i: Integer; begin i := 1; while (i <= n) and (not v in vset[i]) do Inc(i); if i <= n then find := i else find := 0; end; procedure kruskal; var tot, i, j: Integer; begin for i := 1 to n do vset[i] := [i];{初始化定义n个集合,第I个集合包含一个元素I} p := n - 1; q := 1; tot := 0; {p为尚待加入的边数,q为边集指针} Sort; {对所有边按权值递增排序,存于e[I]中,e[I].v1与e[I].v2为边I所连接的两个顶点的序号,e[I].len为第I条边的长度} while p > 0 do begin i := find(e[q].v1); j := find(e[q].v2); if i <> j then begin Inc(tot, e[q].Len); vset[i] := vset[i] + vset[j]; vset[j] := []; Dec(p); end; Inc(q); end; Writeln(tot); end; //delphi/6605