P1536 村村通(洛谷)並查集

2022-06-15 11:54:13 字數 1390 閱讀 6386

隔壁的dgdger帶我看了看老師的lca教程,我因為學習數學太累了(就是懶),去水了一下,感覺很簡單的樣子,於是我也來寫(水)個部落格吧。

題目描述

某市調查城鎮交通狀況,得到現有城鎮道路統計表。表中列出了每條道路直接連通的城鎮。市** "村村通工程" 的目標是使全市任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要相互之間可達即可)。請你計算出最少還需要建設多少條道路?

輸入格式

輸入包含若干組測試測試資料,每組測試資料的第一行給出兩個用空格隔開的正整數,分別是城鎮數目n和道路數目m

隨後的m行對應m條道路,每行給出一對用空格隔開的正整數,分別是該條道路直接相連的兩個城鎮的編號。簡單起見,城鎮從

1到n編號。

注意:兩個城市間可以有多條道路相通。

輸出格式

對於每組資料,對應一行乙個整數。表示最少還需要建設的道路數目。

看這個題板像極了並查集(就是)我們加上一點點優化就可以變成lca(最近公共祖先)。

首先我們先說說並查集怎麼做:並查集就是把相連線的點放到乙個集合裡,就像戰爭一樣,乙個士兵遇見了另乙個,2人如果不是同乙個主公的士兵,就會打起來(不會有士兵自相殘殺吧),那怎麼判斷他們兩個是不是同乙個主公的士兵呢?當然是飛鴿傳書給自己的將軍,將軍要給將軍的將軍飛鴿傳書……等傳到2人主公那裡,主公再告訴他們,得知2人的主公是同一人後,2人就會和諧離去,不是同一人,2人就會打起來,輸了的那個會勸說自己的主公和對方主公合作(因為訓練機制一樣,乙個打不過一隊肯定也打不過,不過這真是太和諧了)。蛋是,士兵們不傻……戰場上這麼多人,每次都要向上級不斷的問也太費勁了,於是士兵們相處了乙個好辦法,已經知道自己的主公是誰時,只要去問問主公,自己有沒有投靠別的主公,如果有,就繼續問。而且中途的將軍和主公們也記下自己最大的主公是誰,這樣以後查詢就會輕鬆很多啦。(其實這就是很簡單的lca)

現在這個題相當於給出了每個士兵的戰況,但現在主公們想要和諧相處,問他們還要讓士兵打幾架?

#include#includeusing namespace std;

long long n,m,a,b,shu;

long long f[1005];

int zbb(int wz)

f[wz]=zbb(f[wz]);//中間迷茫的將軍們找到了自己為誰而廝殺

return f[wz];//讓將軍告訴我

}int main()

shu=0;//勢力的初始化

for(int i=1;i<=n;i++)

scanf("%lld",&m);//給出打了多少架

for(int i=0;i>a>>b;//給出雙方

f[zbb(a)]=zbb(b);//假設b贏了,a的勢力投靠b

} for(int i=1;i<=n;i++)

}cout《哎呀我真是機智,士兵們都會感謝我的。

洛谷P1536 村村通

有t組測試資料 t 是的你沒有看錯,就是無窮大!其實是因為我不知道有多少 每組測試資料給出n個村莊,m條道路,問還需幾條道路,使這張圖聯通。用並查集連線,再統計這張圖還需幾條路聯通。include define r i,a,b for int i a i b i using namespace st...

洛谷P1536 村村通

題目提供者johnkram 標籤雲端 難度普及 提高 時空限制1s 128mb 提交 討論 題解 某市調查城鎮交通狀況,得到現有城鎮道路統計表。表中列出了每條道路直接連通的城鎮。市 村村通工程 的目標是使全市任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要相互之間可達即可 請你計算出最少...

洛谷 最小生成樹 P1536 村村通

題目描述 某市調查城鎮交通狀況,得到現有城鎮道路統計表。表中列出了每條道路直接連通的城鎮。市 村村通工程 的目標是使全市任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要相互之間可達即可 請你計算出最少還需要建設多少條道路?輸入格式 每個輸入檔案包含若干組測試測試資料,每組測試資料的第一行...