增量最小生成树 NEU 1132 Renew MST Quickly

题意:给你一棵树,每一次加上一条边(询问之间互不干扰),让你求它的最小生成树。
n<=1000;q<=100000;
这是一道经典的增量最小生成树,就是模板题。因为是一棵树,所以每次加一条边的时候一定会形成一个环,所找的最小生成树一定不包含这个环上最大的点(MST的回路性质)。
代码:

uses math;
var
        i,j,k,p,n,m,x,y,z,sum,tot:longint;
        head,next,go,len:Array[0..100000]of longint;
        dist:array[0..1000,0..1000]of longint;
        vis:array[0..10000]of boolean;
procedure add(x,y,z:longint);
begin
        inc(tot);
        next[tot]:=head[x];
        go[tot]:=y;
        len[tot]:=z;
        head[x]:=tot;
end;
procedure dfs(k,x,maxx:longint);
var
        i,j,v,d:longint;
begin
        i:=head[x];
        while i<>0 do
        begin
                v:=go[i];
                if not vis[v] then
                begin
                        d:=len[i];
                        vis[v]:=true;
                        dist[k,v]:=max(d,maxx);
                        dfs(k,v,dist[k,v]);
                end;
                i:=next[i];
        end;
end;
begin
        readln(n);
        sum:=0;
        for i:=1 to n-1 do
        begin
                readln(x,y,z);
                add(x,y,z);
                add(y,x,z);
                sum:=sum+z;
        end;
        for i:=1 to n do
        begin
                fillchar(vis,sizeof(vis),0);
                vis[i]:=true;
                dfs(i,i,0);
        end;
        readln(m);
        for i:=1 to m do
        begin
                readln(x,y,z);
                writeln(sum-dist[x,y]+min(dist[x,y],z));
        end;
end.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值