牛客练习赛16C-任意点 (并查集

任意点

题目描述

平面上有若干个点,从每个点出发,你可以往东南西北任意方向走,直到碰到另一个点,然后才可以改变方向。
请问至少需要加多少个点,使得点对之间互相可以到达。

输入

第一行一个整数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;
}

猜你喜欢

转载自blog.csdn.net/wang2332/article/details/80189344
今日推荐