Newcoder 84 C.任意点(并查集)

本文探讨了一个平面几何问题的算法解决方案,旨在计算最少需要增加的点数,以确保平面上任意两点间可通过特定规则相连。通过构建连通块并运用并查集数据结构,文章详细阐述了如何高效求解此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description

平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。

请问至少需要加多少个点,使得点对之间互相可以到达。

Input

第一行一个整数nnn表示点数

第二行nnn行,每行两个整数xi,yix_i, y_ixi,yi表示坐标

yyy轴正方向为北,xxx轴正方形为东。

(1≤n≤100,1≤xi,yi≤1000)(1\le n\le 100,1\le x_i,y_i\le 1000)(1n100,1xi,yi1000)

Output

输出一个整数表示最少需要加的点的数目。

Sample Input

2
2 1
1 2

Sample Output

1

Solution

两点只要横纵坐标至少有一个相同则可以互达,用该关系维护nnn个点的连通块,假设最后有mmm个连通块,那么至少需要m−1m-1m1个点把这些连通块连起来

Code

#include<cstdio>
using namespace std;
const int maxn=105;
int n,x[maxn],y[maxn],fa[maxn];
int find(int x)
{
	if(fa[x]==x)return x;
	return fa[x]=find(fa[x]);
}
void unite(int x,int y)
{
	x=find(x),y=find(y);
	if(x==y)return ;
	fa[x]=y;
}
int main()
{
	scanf("%d",&n);
	for(int i=1;i<=n;i++)fa[i]=i;
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		for(int j=1;j<i;j++)
			if(x[i]==x[j]||y[i]==y[j])unite(i,j);
	}
	int num=0;
	for(int i=1;i<=n;i++)
		if(fa[i]==i)num++;
	printf("%d\n",num-1);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值