最近並查集有點上癮,下午來道黃題提神醒腦(p1111 修復公路)
試題描述
a地區在**過後,連線所有村莊的公路都造成了損壞而無法通車。**派人修復這些公路。
給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路(可以由多條公路連成一條道路)
輸入第11行兩個正整數n,mn,m
下面mm行,每行33個正整數x, y, tx,y,t,告訴你這條公路連著x,yx,y兩個村莊,在時間t時能修復完成這條公路。
輸出如果全部公路修復完畢仍然存在兩個村莊無法通車,則輸出-1−1,否則輸出最早什麼時候任意兩個村莊能夠通車。
輸入示例
4 41 2 6
1 3 4
1 4 5
4 2 3
輸出示例
5其他說明
n≤1000,m≤100000
x≤n,y≤n,t≤100000
很顯然,這是道並查集(不會並查集看:如何模擬修路循序很重要,如果直接迴圈列舉時間,很容易t掉。所以我們要定義乙個結構體,接著直接排序修路時間(結構體排序:然後迴圈m次。每次使兩個集合合併,再判斷所有元素是否處於同一集合。如果是,輸出這次合併所用時間(前面所有次修路在這次時間以內)然後直接return 0,否則繼續迴圈。出了迴圈說明程式沒有結束,於是輸出-1。 **如下。
#include using namespace std;struct bcj
a[100005];
int n,m,fa[1005];
bool cmp(bcj x,bcj y) //按t從小到大排序。
} if(!flag) //說明只有乙個祖先,所以輸出當前時間,結束程式。
}cout<<-1;
return 0;
}
洛谷p1111 修復公路
一開始村莊之間兩兩不連通,按時間從小到大修復公路,判斷兩個村莊是否聯通,若聯通了那就直接看下一條路,若不聯通那就修復。直到m條路都遍歷完。重點來了,最早什麼時候任意兩條村莊都存在至少一條修復完成的道路 可以由多條公路連成一條道路 滿足條件最少需要幾條路?n個村莊就n 1條唄,輸出時判斷公路數有沒有至...
洛谷P1111 修復公路
做完題看了一下題解,發現大佬們用的都是什麼最小生成樹,蒟蒻瑟瑟發抖,其實這題用最簡單的並查集就可以通過 對於時間進行排序,從最早完成的時間開始,每次合併兩條邊,然後檢視他們是否屬於同一集合,如果是,輸出完成時間,直接結束程式 如果遍歷結束還沒用都處於同一聯通塊,那麼就輸出 1.不開o2記得卡常 附 ...
洛谷P1111 修復公路
a地區在 過後,連線所有村莊的公路都造成了損壞而無法通車。派人修復這些公路。給出a地區的村莊數n,和公路數m,公路是雙向的。並告訴你每條公路的連著哪兩個村莊,並告訴你什麼時候能修完這條公路。問最早什麼時候任意兩個村莊能夠通車,即最早什麼時候任意兩條村莊都存在至少一條修復完成的道路 可以由多條公路連成...