题意:给你一棵树,每一次加上一条边(询问之间互不干扰),让你求它的最小生成树。
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.