任意点
题目描述
平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。
请问至少需要加多少个点,使得点对之间互相可以到达。
输入
第一行一个整数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
题意
其实就是求 联通块问题,,,
AC代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500;
int x[MAXN], y[MAXN], par[MAXN];
int n;
void init() {
for(int i = 0; i < MAXN; i++)
par[i] = i;
}
int find(int x) {
if(x == par[x])
return x;
return par[x] = find(par[x]);
}
int main() {
init();
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
}
for(int i = 1; i <= n; i++) {
for(int j = i+1; j <= n; j++) {
if(x[i]==x[j] || y[i]==y[j]) {
int x = find(j);
int y = find(i);
par[x] = y;
}
}
}
int k = -1;
for(int i = 1; i <= n;i++) {
if(find(i) == i)
k++;
}
cout << k << endl;
return 0;
}