并查集
1.首先定义一个结构体数组来存储点的信息
2.路径压缩,初始化都是必要的数据结构,然后我们只需要遍历一下点的集合,如果两个点的横坐标或者众坐标相等,那么我们就把这两个点放入一个集合中
3.最后我们只需要统计一下有几个集合就知道解了,解的个数就是集合的个数减一,我们可以这么想如果有两个不相交的集合,我们只需要加一个点就可以让两个集合联系起来
#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; struct node { int xi, yi; } w[maxn]; int pre[maxn]; int find(int x) //路径压缩 { if (x != pre[x]) pre[x] = find(pre[x]); return pre[x]; } void join(int x, int y) { int a = find(x); int b = find(y); if (a != b) pre[a] = b; } int main() { int n; scanf("%d", &n); for (int i = 1; i <= n; ++i) //初始化 pre[i] = i; for (int i = 1; i <= n; ++i) scanf("%d%d", &w[i].xi, &w[i].yi); for (int i = 1; i < n; ++i) //防止越界,i要小于n不能等 for (int j = i + 1; j <= n; ++j) if (w[i].xi == w[j].xi || w[i].yi == w[j].yi) join(i, j); int ans = 0; for (int i = 1; i <= n; ++i) if (pre[i] == i) ++ans; printf("%d\n", ans - 1); }