暴力摩托(並查集)

2021-06-18 21:25:59 字數 1528 閱讀 2774

英雄最喜歡玩暴力摩托,乙個通宵之後,總算過了全關!正當他為自己的成績洋洋得意的時候卻發現居然還有乙個特別的附加關!華英雄雖然累得眼睛都睜不開了,但是他還是決定再試一試! 

這一關與以前的關不同,包含有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 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 lq 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.

並查集 並查集

本文參考了 挑戰程式設計競賽 和jennica的github題解 陣列版 int parent max n int rank max n void init int n int find int x else void union int x,int y else 結構體版 struct node ...

NBUT 1451 Elise 暴力 並查集

題意 蜘蛛女皇 伊莉絲有很多個小蜘蛛,如果小蜘蛛沒有共同的興趣愛好的話就會內訌,為了讓小蜘蛛們不內鬨,伊莉絲能夠花費1點體力讓乙個小蜘蛛培養乙個興趣。求最少花費的體力是多少?分析 因為涉及到集合,所以就想到了並查集,給每乙個興趣編號,每個小蜘蛛也有乙個編號,暴力列舉每乙個小蜘蛛的興趣愛好,如果有其他...

並查集入門(普通並查集 帶刪除並查集 關係並查集)

什麼是並查集?通俗易懂的並查集詳解 普通並查集 基礎並查集 例題 題解 how many tables problem description lh boy無聊的時候很喜歡數螞蟻,而且,還給每乙隻小螞蟻編號,通過他長期的觀察和記錄,發現編號為i的螞蟻會和編號為j的螞蟻在一起。現在問題來了,他現在只有...