链接:
https://www.nowcoder.com/acm/contest/84/C
来源:牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld
题目描述
平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。
请问至少需要加多少个点,使得点对之间互相可以到达。
请问至少需要加多少个点,使得点对之间互相可以到达。
输入描述:
第一行一个整数n表示点数( 1 <= n <= 100)。 第二行n行,每行两个整数xi, yi表示坐标( 1 <= xi, yi <= 1000)。 y轴正方向为北,x轴正方形为东。
输出描述:
输出一个整数表示最少需要加的点的数目。
示例1
输入
2 2 1 1 2
输出
1
示例2
输入
2 2 1 4 1
输出
0
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N =1e4+10;
int a[N];
int f[N];
struct AA{
int x,y,id;
//AA(){}
//AA(int xx,int yy,int dd);
}aa[N];
bool cmp(AA a,AA b){
if(a.x==b.x)return a.y<b.y;
return a.x<b.x;
}
bool cmp2(AA a,AA b){
if(a.y==b.y)return a.x<b.x;
return a.y<b.y;
}
int find(int x){
if(f[x]==-1)return x;
return f[x]=find(f[x]);
}
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
//freopen("in.txt","r",stdin);
int n;
cin>>n;
memset(f,-1,sizeof(f));
for(int i=0;i<n;i++){
cin>>aa[i].x>>aa[i].y;
aa[i].id=i;
}
sort(aa,aa+n,cmp);
for(int i=1;i<n;i++){
if(aa[i-1].x==aa[i].x){
int p=find(aa[i].id);
int q=find(aa[i-1].id);
if(p==q)continue;
f[p]=q;
}
}
sort(aa,aa+n,cmp2);
for(int i=1;i<n;i++){
if(aa[i-1].y==aa[i].y){
int p=find(aa[i].id);
int q=find(aa[i-1].id);
if(p==q)continue;
f[p]=q;
}
}
int cnt=0;
for(int i=0;i<n;i++){
if(find(i)==i)cnt++;
}
//cout<<find(aa[i].id)<<" ";
cout<<cnt-1<<endl;
//cout<<endl;
}