英雄最喜欢玩暴力摩托,一个通宵之后,总算过了全关!正当他为自己的成绩洋洋得意的时候却发现居然还有一个特别的附加关!华英雄虽然累得眼睛都睁不开了,但是他还是决定再试一试!
这一关与以前的关不同,包含有N个站,之间连了M条双向的通路!但每条路都规定了一个Speed值,在这条路上必须以这个速度前进!所以在前进的时候要频繁的调整速度,这对鱼类来说是很痛苦的,所以华英雄决定尽量使调整的幅度小一些,也就是使走过的路的速度最大值与最小值之差最小!
可最近华英雄由于沉溺在暴力摩托中,已经荒废了编程技术,所以只有请你来帮忙了!^_^
此题将边排序后,克鲁斯卡尔即可,枚举第一条边,所求答案及是最后一条边与第一条边的差,时间复杂度O(nmk)。
var
father,fa,son,v:array[0..1000] of longint;
n,m,k,s,t:longint;
function find(x:longint):longint;
begin
if fa[x]=x then exit(x);
fa[x]:=find(fa[x]);
exit(fa[x]);
end;
procedure qsort(l,r:longint);
var i,j,t,m:longint;
begin
i:=l; j:=r; m:=v[(i+j) div 2];
repeat
while v[i]<m do inc(i);
while v[j]>m do dec(j);
if i<=j then
begin
t:=v[i]; v[i]:=v[j]; v[j]:=t;
t:=father[i]; father[i]:=father[j]; father[j]:=t;
t:=son[i]; son[i]:=son[j]; son[j]:=t;
inc(i); dec(j);
end;
until i>j;
if l<j then qsort(l,j);
if i<r then qsort(i,r);
end;
procedure work;
var i,j,k,ans,p,q:longint;
begin
ans:=maxlongint;
for i:=1 to m do
begin
for j:=1 to n do fa[j]:=j;
for j:=i to m do
begin
p:=find(father[j]);
q:=find(son[j]);
if p<>q then
fa[q]:=p;
if find(s)=find(t) then break;
end;
if fa[s]=fa[t] then
if ans>v[j]-v[i] then ans:=v[j]-v[i];
end;
writeln(ans);
end;
procedure init;
var i,j,p,q:longint;
begin
readln(n,m);
for i:=1 to m do
readln(father[i],son[i],v[i]);
qsort(1,m);
readln(k);
for i:=1 to k do
begin
readln(s,t);
work;
end;
end;
begin
init;
end.