B - 暢通工程 (HDU - 1232)
阿新 • • 發佈:2018-02-15
include 狀況 暢通工程 運用 stream gpo cst init blog
- 題目大意
某省調查城鎮交通狀況,得到現有城鎮道路統計表,表中列出了每條道路直接連通的城鎮。省政府“暢通工程”的目標是使全省任何兩個城鎮間都可以實現交通(但不一定有直接的道路相連,只要互相間接通過道路可達即可)。問最少還需要建設多少條道路?
- 解題思路
運用並查集的知識可以很容易做出。初始化時每個城鎮都沒有路,所以要連接的路的數量為n-1個,之後在增加路的過程中,先用並查集搜索,如果兩個城鎮確實不在一個集合,這條路就有用,兩個城鎮歸為一個集合中,要連接的路減一。如果兩個城鎮之前就已經在一個集合裏,增加的這條路就無用,要連接的路不變
- 代碼
#include<iostream> #include<cstdio> using namespace std; const int MAX = 1e5 + 50; int fa[MAX]; void init(int n) { for (int i = 0; i <= n; i++) fa[i] = i; } int find(int x) { if (x == fa[x]) return x; else { return fa[x] = find(fa[x]); } } int main() { int n,m,x, y; scanf("%d", &n); while (n != 0) { scanf("%d", &m); init(n); int sum = n-1; for (int i = 0; i < m; i++) { cin >> x >> y; int fx = find(x), fy = find(y); if (fx == fy) continue; else { fa[fx] = fy; sum--; } } printf("%d\n", sum); scanf("%d", &n); } return 0; }
B - 暢通工程 (HDU - 1232)