C | 任意点 |
题目描述
平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。
请问至少需要加多少个点,使得点对之间互相可以到达。
请问至少需要加多少个点,使得点对之间互相可以到达。
输入描述:
第一行一个整数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<iostream>
#define ll long long
using namespace std;
typedef pair<int, int> P;
const int maxn = 1e2+7;
int s[maxn][maxn], n, sum = 0;
int ran[maxn], pnt[maxn];
P p[maxn];
int hfind(int x) {
if(pnt[x] == x) return x;
else return pnt[x] = hfind(pnt[x]);
}
void hmerge(int x, int y) {
int dx = hfind(x), dy = hfind(y);
if(dx != dy) pnt[dx] = dy;
}
int main()
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d%d",&p[i].first,&p[i].second);
for(int i = 0; i < n; i++) pnt[i] = i;
for(int i = 0; i < n; i++)
for(int j = i + 1; j < n; j++)
if(p[i].first == p[j].first || p[i].second == p[j].second) hmerge(i,j);
for(int i = 0; i < n; i++) if(pnt[i] == i) sum ++;
cout << (sum - 1) << endl;
}