好久沒練了,忽然感覺對並查集陌生了好多,今天專門找題來練一下才發現之前掌握的並查集太片面了。
國王的煩惱,這個題大意是:n個島嶼,有m條大橋,每條大橋連線兩個島嶼,可能有兩個相同島嶼之間有多條大橋的情況。
輸入:n,m,
m行橋,每行包含: 島嶼a,島嶼b,該橋剩餘工作的天數。
說:每斷裂一所能夠導致原本兩座可以聯通的橋無法直接也無法再間接到達彼此後,人們就**一天。問:一共**幾天?
解剖一下大佬的思路外加自己搞懂的過程:
首先,將橋按照剩餘天數遞減排列,然後開始遍歷所有的橋,網上的思路是從遍歷的第一座橋開始,判斷他倆原來是否來連通,如果不聯通並且**的這天和上一次**的那天不是一天就把結果++,!!到著我就不明白了,為什麼要判斷或者怎麼能夠判斷到他倆原來連不連通,肯定不聯通啊,這才遍歷第乙個而且咱之前啥工作也沒做啊,除了排序,,,沒錯,就是排序,我們做了排序啊!!,遞減排序,也就意味著每次遍歷到的都是咱剩下未遍歷得所有橋中最晚斷裂的,從咱排序的第一座也就是事件最後斷裂的橋一定會引起**加一天,然後再將他連線好,往下進行遍歷,此時也就滿足了下乙個橋段斷裂時情況判斷的條件(此時還有哪些橋是聯通的),至於與上一次**的天數不等這個大家都懂的的啦!上**:
#include
#include
#include
#include
#include
using namespace std;
int pre[10000+10]=;
typedef struct nodeway;
bool cmp(way a, way b)
int find(int x)
int union1(int x,int y)
return 0;
}int main()
sort(ww,ww+m,cmp);
int pr=-1,ans=0;
for(int i=0;iint pd =union1(ww[i].x,ww[i].y);
if(pd&&pr!=ww[i].day)
}cout} !!!!手誤多打了個!號,陣列開小了卡了我半天,,,,
總的來說:帶有一點逆向思維的意思。
藍橋杯 歷屆試題 國王的煩惱
關鍵 從最大的天數往前開始建立連通圖 思路 以天數為表頭建立鄰接表 取出最大和最小的天數,從最大的天數開始往前計算,一直算到最小的天數,如果某一天t將兩個不連通的小島連線起來則該天會收到 如果某條邊連線的島是相連 則不做任何處理 已知n個點的最小連通圖的邊數最少為n 1條,當連線的邊數為n 1時所有...
歷屆試題 國王的煩惱 藍橋杯
問題描述 c國由n個小島組成,為了方便小島之間聯絡,c國在小島間建立了m座大橋,每座大橋連線兩座小島。兩個小島間可能存在多座橋連線。然而,由於海水沖刷,有一些大橋面臨著不能使用的危險。如果兩個小島間的所有大橋都不能使用,則這兩座小島就不能直接到達了。然而,只要這兩座小島的居民能通過其他的橋或者其他的...
歷屆試題 國王的煩惱 (藍橋杯)
問題描述 c國由n個小島組成,為了方便小島之間聯絡,c國在小島間建立了m座大橋,每座大橋連線兩座小島。兩個小島間可能存在多座橋連線。然而,由於海水沖刷,有一些大橋面臨著不能使用的危險。如果兩個小島間的所有大橋都不能使用,則這兩座小島就不能直接到達了。然而,只要這兩座小島的居民能通過其他的橋或者其他的...