a地區在**過後,連線所有村莊的公路都造成了損壞而無法通車。**派人修復這些公路。(為什麼一群人都在寫生成樹啊喂。。。明明帶權並查集就行了啊。。。)給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路(可以由多條公路連成一條道路)
輸入格式:
第1行兩個正整數n,m
下面m行,每行3個正整數x, y, t,告訴你這條公路連著x,y兩個村莊,在時間t時能修復完成這條公路。
輸出格式:
如果全部公路修復完畢仍然存在兩個村莊無法通車,則輸出-1,否則輸出最早什麼時候任意兩個村莊能夠通車。
輸入樣例#1:
4 4輸出樣例#1:1 2 6
1 3 4
1 4 5
4 2 3
5n<=1000,m<=100000x<=n,y<=n,t<=100000
首先按照暴力來看,先把所有的道路按照時間排序,然後從小到大依次修改就行。
合併的時候需要在樸素並查集的基礎上再維護當前集合的大小,開乙個size陣列扔給祖先就行了。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7view code8using
namespace
std;910
intn, m;
1112
struct
state st[110000
];15
16bool
cmp(state a, state b)
1920
int fa[110000], sz[110000
];21
22int
get(int
x) 25
26void merge(int x, int
y) 31
32int
main()
38 sort(st + 1, st + 1 +m, cmp);
39for(int i = 1 ; i <= m ; i ++) 45}
46if(sz[get(1)] != n) puts("-1"
);47
}48
luogu整理 P1111 修復公路
大體題意 給定n個點,一條一條邊加到圖裡面,然後判斷什麼時候成為乙個連通圖。我一開始的時候是每增加一條邊就重新掃一掃這個圖,但是時間複雜度很顯然不夠用,所以我第一遍就炸了。後來我發現實際上每次加入一條邊的時候,判斷會不會減少乙個連通塊就可以。並查集容易出現的bug 每次合併的時候,應該寫成這樣 fa...
洛谷 1111 修復公路
題目描述 給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路 可以由多條公路連成一條道路 輸入輸出格式 輸入格式 第111行兩個正整數n,m 下面...
LUOGU P1111 修復公路
題目背景 a地區在 過後,連線所有村莊的公路都造成了損壞而無法通車。派人修復這些公路。題目描述 給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路...