1. 程式人生 > >B - 暢通工程 (HDU - 1232)

B - 暢通工程 (HDU - 1232)

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)