九度 1012 暢通工程

2022-09-23 09:27:12 字數 1044 閱讀 9621

題目描述:

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

輸入測試輸入包含若干測試用例。每個測試用例的第1行給出兩個正整數,分別是城鎮數目n ( < 1000 )和道路數目m;隨後的m行對應m條道路,每行給出一對正整數,分別是該條道路直接連通的兩個城鎮的編號。為簡單起見,城鎮從1到n編號。

注意:兩個城市之間可以有多條道路相通,也就是說

3 31 2

1 22 1

這種輸入也是合法的

當n為0時,輸入結束,該用例不被處理。

輸出對每個測試用例,在1行裡輸出最少還需要建設的道路數目。

樣例輸入

4 21 3

4 33 3

1 21 3

2 35 2

1 23 5

999 0

0樣例輸出10

2998

解題思路:

並查集問題,考慮到資料量較大的情況,可使用路徑壓縮。

注意:計算集合數量時,不需要使用set來統計不同father的數量,而應該使用father[i]==i來判斷。

ac**:

#include

const int maxn = 1010;

int n, m;

int father[maxn];

int findfather(int n)

while(m != father[m])

return n;

}void merge(int a, int b)

}int count(int n, int father)

return ans;

}int main()

for(int k = 1; k <= m; k++)

printf("%d\n", count(n, father) - 1);

}fclose(stdin);

return 0;

}

九度 題目1012 暢通工程

這題我是以連通域來做的,n個點至少需要n 1個邊才能連通。如果形成迴路,則相當於有這條邊浪費了,沒有任何價值。最終至少還需要多少邊才能把所有的城鎮聯通,也就是求剩下的孤立的點和連通域之間還需要幾條邊才能連通!比如 最後利用程式求得3個連通域和2個孤立的點,那麼至少需要3 2 1 5條邊才能全部連通 ...

題目1012 暢通工程

這道題如果不用並查集感覺根本無從下手,可以將題目理解為 如果兩點之間有路徑,那麼與他們連線的其他結點也就貫通了,即可以歸屬於同乙個集合,關於並查集方法的敘述,有一篇部落格講的很好 include using namespace std int tree 1000 int findroot int x...

題目1012 暢通工程

題目描述 某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省 暢通工程 的目標是使全省任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要互相間接通過道路可達即可 問最少還需要建設多少條道路?輸入 注意 兩個城市之間可以有多條道路相通,也就是說 3 31 2 ...