B

- 题目大意

    某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路? 

- 解题思路

    运用并查集的知识可以很容易做出。初始化时每个城镇都没有路,所以要连接的路的数量为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
", sum);
		scanf("%d", &n);

	}
	return 0;
}

  

原文地址:https://www.cnblogs.com/alpacadh/p/8449430.html