農夫約翰的奶牛已經厭倦了他每天早上離開牲口棚前要它們自己整理的要求。奶牛他們剛剛完成了量子物理學博士學位,準備加快速度。
今天早上,和往常一樣,農夫john的n頭奶牛(1≤n≤105),編號為1…n,分散在穀倉的n個不同的位置,也編號為1…n,這樣奶牛i就在pi的位置。但今天上午有m個蟲洞(1≤m≤105),編號1…m,其中蟲洞i雙向連線位置ai和位置bi,且寬度wi(1≤ai,bi≤n,ai≠bi,1≤wi≤109)。
在任何時間點,位於蟲洞兩端的兩頭奶牛可以選擇同時通過蟲洞交換位置。奶牛必須執行這樣的交換,直到奶牛i到達位置i, 1≤i≤n。
奶牛們並不渴望被蟲洞壓扁,請幫助他們算出排序他們自己時,通過的最小蟲洞的最大值。資料可以保證奶牛可以排序自己滿足題意。
輸入
第一行包含兩個整數,n和m。
第二行包含n個整數p1 p2…pn。它保證p是1…n的乙個排列。
對於1和m之間的每個i,行i+2包含整數ai、bi和wi。
輸出
單個整數:牛在排序過程中必須擠進的最小蟲洞寬度的最大值。如果奶牛不需要任何蟲洞來分類,則輸出- 1。
有一蟲洞能位置a,b互通,就像是圖論的邊。而所通過的蟲洞的最小值也就是所有通過的邊的最小值。如果這個最小值確定,那麼可以確定這個圖有幾條邊,檢查每個點是否可以通過這些邊到達指定位置,運用並查集可以實現這一點(同個祖先即可以到達指定位置)。顯然,這個最小值可以從最大邊開始遍歷,但直接遍歷會超時,用二分可以ac。
注意:在使用並查集時,因為會多次使用查詢祖先的函式,如果不路徑壓縮,會重複很多已經遍歷的祖先,結果會超時。
#include
#include
#include
using
namespace std;
const
int maxn =
100007
;int n,m;
int p[maxn]
;int fa[maxn]
;struct node
wormhole[maxn]
;//蟲洞
void
init()
//fa的初始化
bool
cmp(node x, node y)
//並查集
intfin
(int x)
void
uni(
int x,
int y)
bool
judge
(int x)
return cnt;
}int
main()
for(
int i=
0; i
)scanf
("%d%d%d"
,&wormhole[i]
.a,&wormhole[i]
.b,&wormhole[i]
.w);
if(ifno)
sort
(wormhole,wormhole+m,cmp)
;init()
;//二分
int left =
0, right = m-1;
while
(right-left>1)
printf
("%d\n"
,wormhole[right]
.w);
return0;
}
GDUT 寒假訓練題解報告 專題II
題目 省自從實行了很多年的暢通工程計畫後,終於修建了很多路。不過路多了也不好,每次要從乙個城鎮到另乙個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。input 本題目包含多組資料,...
2020 2 19GDUT寒假訓練排位賽1 I
農夫約翰出去在路上散步,他想他可能迷路了 沿路有n個農場 1個 n 100個 不幸的是,農場沒有門牌號,這使得農場主約翰很難確定他在路邊的位置。然而,每個農場的路邊都有乙個彩色的郵筒,所以農民約翰希望,如果他看到離他最近的郵筒的顏色,他可以唯一地確定他在 每個郵箱的顏色由大寫字母a z指定。因此,這...
2020 2 22GDUT寒假訓練排位賽2 G
農場失火了,牛都跑去把火撲滅 農場是由乙個10 10的網格來描述的,就像這樣 字母 b 代表剛剛著火的穀倉。l 代表乙個湖,r 代表一塊大石頭的位置。奶牛們想要組成乙個 水桶旅 把自己安置在湖和穀倉之間的一條小路上,這樣它們就可以沿著小路傳遞一桶桶的水來幫助滅火。如果牛在北 南 東 西四個方向相鄰,...