最小生成树prim+kruskal模板

prim

var
    a:array[1..10000,1..3] of longint;
    b:array[1..100,1..100] of longint;
    t:array[1..3] of longint;
    i,j,min,mij,ans,n,k:longint;
begin
    ans:=0;
    read(n);
    for i:=1 to n do
    for j:=1 to n do
    read(b[i,j]);
    for i:=1 to n-1 do
    begin
        a[i,1]:=1;
        a[i,2]:=i+1;
        a[i,3]:=b[1,i+1];
    end;
    for i:=1 to n-1 do
    begin
        min:=maxlongint;
        for j:=i to n-1 do
        begin
            if a[j,3]<min then begin min:=a[j,3]; mij:=j; end;
        end;
        if mij<>i then begin t:=a[i]; a[i]:=a[mij]; a[mij]:=t; end;
        k:=a[i,2];
        for j:=i+1 to n-1 do
        begin
            if b[a[j,2],k]<a[j,3] then begin a[j,3]:=b[a[j,2],k]; a[j,1]:=k; end;
        end;
        ans:=ans+a[i,3];
    end;
    writeln(ans);
end.      

kruskal

var
    fa:array[1..100] of longint;
    a:array[1..100000,1..3] of longint;
    i,j,k,n,x,y,z,ans:longint;

function getfather(z:longint):longint;
begin
    if fa[z]=0 then getfather:=z
    else
    begin
        fa[z]:=getfather(fa[z]);
        getfather:=fa[z];
    end;
end;

procedure bj(z,b:longint);
begin
    z:=getfather(z);
    b:=getfather(b);
    if z<>b then fa[z]:=b;
end;


procedure dg(i,j:longint);
var
    l,r,m:longint;
    t:Array[1..3] of longint;
begin
    l:=i;
    r:=j;
    m:=a[i,3];
    repeat
        while a[j,3]>m do  j:=j-1;
        while a[i,3]<m do  i:=i+1;
        if j>=i then
                begin
                    t:=a[i];
                    a[i]:=a[j];
                    a[j]:=t;
                    j:=j-1;
                    i:=i+1;
                end;
    until i>j;
    if l<j then dg(l,j);
    if i<r then dg(i,r);
end;

begin
    assign(input,'kruskal.in'); reset(input);
    assign(output,'kruskal.out'); rewrite(output);
    read(n);
    k:=1;
    for i:=1 to n do
    for j:=1 to n do
    begin
        if i<j then
        begin
            a[k,1]:=i;
            a[k,2]:=j;
            read(a[k,3]);
            inc(k)
        end
        else read(z);
    end;
    ans:=0;
    dec(k);
    dg(1,k);
    for i:=1 to k do
    begin
        x:=getfather(a[i,1]);
        y:=getfather(a[i,2]);
        if x<>y then
        begin
            ans:=ans+a[i,3];
            bj(a[i,1],a[i,2]);
        end;
    end;
    writeln(ans);
    close(input); close(output);
end.                 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值