洛谷试题——村村通

村村通(并查集)

链接https://www.luogu.com.cn/problem/P1536

根据题意可知有若干组数据,我们需要对每组数据使用并查集,然后判断最少需要建设多少条路才能使各个城镇之间互通。

下面放蒟蒻的代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<algorithm>
#define MAXN 0x3f3f3f3f;
using namespace std;
	int CC[10001];
	int n, m;
	int x, y;

	void make_set()//并查集初始化
	{
		for (int i = 1; i <= n; i++)
			CC[i] = i;
	}
	int findx(int x)//并查集查找
	{
		if (CC[x] != x)
		{
			CC[x] = findx(CC[x]);
		}
		return CC[x];
	}
	void unity(int t1, int t2)//合并
	{
		int x1 = findx(t1);
		int	y1 = findx(t2);
		if(x1!=y1)
		CC[x1] = y1;

	}
	int main()
	{
		while (true)
		{
			int ans = 0;
			cin >> n;
			if (n == 0)//结束标志
			{
				return 0;
			}
			cin >> m;
			make_set();//每一组数据结束 对并查集初始化
			for (int i = 1; i <= m; i++)
			{

				cin >> x >> y;
				unity(x, y);//合并
			}
			for (int i = 1; i <= n; i++)
			{
				if (i == findx(i))
					ans++;
			}
			printf("%d\n", ans - 1);

		}
		return 0;
	}

下面分析一下这个代码

for (int i = 1; i <= n; i++)
			{
				if (i == findx(i))
					ans++;
			}

拿这个数据分析吧!!!!

4 2
1 3
4 3

已知有四个城镇,其中1-3是相通的,4-3也是相通的,因此CC[1]=3,CC[4]=3,CC[3]=3,,CC[2]=2;

可以知道1,3,4是相连的,其中1和4的并查集都不等于自己本身,都等于3,而另外两个城镇都等于自己本身,因此1和4必定与另外两个中的一个相连,所有得出有3个城镇相连,因此,我们只需要统计并查集为本身的城镇,然后减去1,就是我们需要修的路。

posted @ 2020-09-06 00:15  故犹  阅读(50)  评论(0编辑  收藏  举报