暴力摩托(并查集)

英雄最喜欢玩暴力摩托,一个通宵之后,总算过了全关!正当他为自己的成绩洋洋得意的时候却发现居然还有一个特别的附加关!华英雄虽然累得眼睛都睁不开了,但是他还是决定再试一试! 
这一关与以前的关不同,包含有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.




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值