克鲁斯卡尔

type arr=record
        u,v,w,nt:longint;
        end;
var i,j,m,n,x,y:longint;
    ans:int64;
    a:array[0..200008] of arr;
    fa:array[0..200008] of longint;
function find(x:longint):longint;
begin
    if fa[x]=x then exit(x);
    fa[x]:=find(fa[x]);
    exit(fa[x]);
end;
procedure sort(l,r:longint);
var i,j,x:longint;
    temp:arr;
begin
    i:=l;j:=r; x:=a[(l+r) div 2].w;
    while i<=j do
    begin
        while a[i].w<x do inc(i);
        while x<a[j].w do dec(j);
        if i<=j then
        begin
            temp:=a[i];
            a[i]:=a[j];
            a[j]:=temp;
            inc(i);
            dec(j);
        end;
    end;
    if l<j then sort(l,j);
    if i<r then sort(i,r);
end;
begin
    readln(n,m);
    for i:=1 to m do readln(a[i].u,a[i].v,a[i].w);
        for i:=1 to n do fa[i]:=i;
    sort(1,m);
    for i:=1 to m do
    begin
        x:=find(a[i].u);
        y:=find(a[i].v);
        if x<>y then
        begin
            ans:=ans+a[i].w;
            fa[x]:=y;
        end;
    end;
    writeln(ans);
end.
原文地址:https://www.cnblogs.com/rpSebastian/p/4325686.html