Luogu 1111 修復公路

2022-03-25 21:52:47 字數 1318 閱讀 4052

a地區在**過後,連線所有村莊的公路都造成了損壞而無法通車。**派人修復這些公路。

給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路(可以由多條公路連成一條道路)

輸入格式:

第1行兩個正整數n,m

下面m行,每行3個正整數x, y, t,告訴你這條公路連著x,y兩個村莊,在時間t時能修復完成這條公路。

輸出格式:

如果全部公路修復完畢仍然存在兩個村莊無法通車,則輸出-1,否則輸出最早什麼時候任意兩個村莊能夠通車。

輸入樣例#1:

4 4

1 2 6

1 3 4

1 4 5

4 2 3

輸出樣例#1:

5
n<=1000,m<=100000

x<=n,y<=n,t<=100000

(為什麼一群人都在寫生成樹啊喂。。。明明帶權並查集就行了啊。。。)

首先按照暴力來看,先把所有的道路按照時間排序,然後從小到大依次修改就行。

合併的時候需要在樸素並查集的基礎上再維護當前集合的大小,開乙個size陣列扔給祖先就行了。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

8using

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

view code

luogu整理 P1111 修復公路

大體題意 給定n個點,一條一條邊加到圖裡面,然後判斷什麼時候成為乙個連通圖。我一開始的時候是每增加一條邊就重新掃一掃這個圖,但是時間複雜度很顯然不夠用,所以我第一遍就炸了。後來我發現實際上每次加入一條邊的時候,判斷會不會減少乙個連通塊就可以。並查集容易出現的bug 每次合併的時候,應該寫成這樣 fa...

洛谷 1111 修復公路

題目描述 給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路 可以由多條公路連成一條道路 輸入輸出格式 輸入格式 第111行兩個正整數n,m 下面...

LUOGU P1111 修復公路

題目背景 a地區在 過後,連線所有村莊的公路都造成了損壞而無法通車。派人修復這些公路。題目描述 給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路...