题目描述
David是个滑雪初学者,他还没有学会如何在滑行过程中控制方向,也不知道如何停下来。所以他的滑行方式只能是在一个高高的雪堆上调整好向北,东,南或西移动的方向,然后直线滑下来,一直滑倒另一个雪堆底下才能停下来。
他发觉以这种方式,有些雪堆他是无法到达的。因此,他现在想在已有的雪堆基础上,自己再人为地增加一些雪堆,使得他可以从任何雪堆转移到其他任何雪堆。他请求您帮他找到需要创建的雪堆的最少数量。
我们假设David只能在整数坐标处堆积雪堆。
输入
输入的第一行包含一个整数n(1≤n≤100),表示已有的雪堆数量。 接下来的n行中的每行包含两个整数Xi和Yi(1≤Xi,Yi≤1000),表示已有的第i个雪堆的坐标。
请注意,北方向与Oy轴方向一致,因此东方向与Ox轴方向一致。 所有雪堆的位置都不同。
输出
输出为使David能够从任何雪堆到达其他任何雪堆而需要创建的最小雪堆数。
样例输入
2
2 1
1 2
样例输出
1
代码
#include <iostream>
#include <set>
using namespace std;
set<int> X;
set<int> Y;
int main()
{
int ans=0;
int n;
cin >> n;
int x,y;
cin >>x >> y;
X.insert(x);
Y.insert(y);
while(n>1)
{
int x,y;
cin >> x >> y;
if(X.count(x)==0&&Y.count(y)==0)
{
ans++;
X.insert(x);
Y.insert(y);
}
n--;
}
cout << ans;
}