洛谷试题——村村通
村村通(并查集)
链接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,就是我们需要修的路。