AT_joisc2007_fiber 光ファイバー (Fiber) 题解

题目链接

由题目容易想到用并查集记录联通块个数,再将每个联通块相连。所以答案为联通块个数 \(-1\)

由于某些特殊性质,本题的输出需要加换行才能通过。

#include<iostream>
#include<cstdio>
using namespace std;
const int N=10100;
int n,m,x,y,fa[N],cnt;
int find1(int dx)
{
	return dx==fa[dx]?dx:fa[dx]=find1(fa[dx]);
}
void merge1(int dx,int dy)
{
	int gx=find1(dx),gy=find1(dy);
	if(gx!=gy) fa[gx]=gy;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		merge1(x,y);
	}
	for(int i=1;i<=n;i++)
	{
		if(fa[i]==i) cnt++;
	}
	printf("%d\n",cnt-1);
	return 0;
} 
posted @ 2024-08-12 11:08  MinimumSpanningTree  阅读(5)  评论(0)    收藏  举报