任意点

任意点

https://ac.nowcoder.com/acm/problem/15808

并查集

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);
}
全部评论

相关推荐

点赞 评论 收藏
分享
05-03 12:45
西南大学 Java
nsnzkv:你这项目写的内容太多了,说实话都是在给自己挖坑,就算简历过了,后面面试也难受
点赞 评论 收藏
分享
程序员牛肉:主要是因为小厂的资金本来就很吃紧,所以更喜欢有实习经历的同学。来了就能上手。 而大厂因为钱多,实习生一天三四百的就不算事。所以愿意培养你,在面试的时候也就不在乎你有没有实习(除非是同级别大厂的实习。) 按照你的简历来看,同质化太严重了。项目也很烂大街。 要么换项目,要么考研。 你现在选择工作的话,前景不是很好了。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务