数据结构(荣誉)实验一 并查集

简介: 数据结构(荣誉)实验一 并查集

1.并查集基础


题目描述


现在有一个并查集,你需要完成合并和查询操作。


输入


第一行包含两个整数 N,M ,表示共有 N 个元素和 M 个操作。

接下来M 行,每行包含三个整数 Zi,Xi,Yi 。

当 Zi=1 时,将 Xi 与 Yi 所在的集合合并。

当Zi=2 时,输出Xi 与 Yi 是否在同一集合内,是的输出 Y ;否则输出 N 。


输出


对于每一个Zi=2 的操作,都有一行输出,每行包含一个大写字母,为 Y 或者 N 。


样例输入


4 7

2 1 2

1 1 2

2 1 2

1 3 4

2 1 4

1 2 3

2 1 4


样例输出


N

Y

N

Y


题解

#include <iostream>
using namespace std;
int main() {
 int n, t;
 cin >> n >> t;
 int* arr = new int[n+10];
 for (int i = 0; i < n+1; i++) {
  arr[i] = i;
 }
 while (t--) {
  int a, b, c;
  cin >> a >> b >> c;
  if (a == 1) {
   while (arr[b]!=b) {
    b = arr[b];
   }
   while (arr[c] != c){
    c = arr[c];
   }
   arr[c] = b;
  }
  else if (a == 2) {
   while (arr[b] != b) {
    b = arr[b];
   }
   while (arr[c] != c) {
    c = arr[c];
   }
   if (arr[b] == arr[c]) {
    cout << "Y" << endl;
   }
   else {
    cout << "N" << endl;
   }
  }
 }
}


2. 红娘


题目描述


小明在A公司工作,小红在B公司工作。A公司有N名男员工,其中有P对有朋友关系。B公司有M名女员工,其中有Q对有朋友关系。假设朋友的朋友还是朋友。

每对朋友关系用两个整数(Xi, Yi)组成,表示朋友的编号分别为Xi,Yi。男人的编号是正数,女人的编号是负数。小明的编号是1,小红的编号是-1.

小明和小红是情侣,他们想撮合A、B公司的员工成为情侣。只有异性男女才能成为情侣,而且任何一方都不能脚踏两只船哦。那么,请问两公司之间,通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)


输入


第1行,4个空格隔开的正整数N,M,P,Q。

之后P行,每行两个正整数, Xi, Yi。

之后Q行,每行两个负整数, Xi, Yi。


输出


一个正整数,表示通过小明和小红认识的人最多一共能配成多少对情侣。(包括他们自己)


样例输入


4 3 4 2

1 1

1 2

2 3

1 3

-1 -2

-3 -3


样例输出


2


题解

#include <algorithm>
#include <iostream>
using namespace std;
class UnionSet
{
private:
    int *roots;
    int length;
public:
    UnionSet(int n)
    {
        roots = new int[n + 1];
        for (int i = 1; i <= n; i++)
        {
            roots[i] = i;
        }
        length = n;
    }
    ~UnionSet()
    {
        delete[] roots;
    }
    int find(int a)
    {
        int p = a;
        while (roots[p] != p)
        {
            p = roots[p];
        }
        return p;
    }
    void unionMerge(int a, int b)
    {
        int x = find(a);
        int y = find(b);
        roots[y] = x;
    }
    int countRoot()
    {
        int x = find(1);
        int num = 0;
        for (int i = 1; i <= length; i++)
        {
            if (x == find(i))
            {
                num++;
            }
        }
        return num;
    }
};
int main()
{
    int n, m, p, q;
    cin >> n >> m >> p >> q;
    UnionSet male(n);
    UnionSet female(n);
    while (p--)
    {
        int x, y;
        cin >> x >> y;
        male.unionMerge(x, y);
    }
    while (q--)
    {
        int x, y;
        cin >> x >> y;
        female.unionMerge(-x, -y);
    }
    cout << min(male.countRoot(), female.countRoot()) << endl;
    return 0;
}


3.滑雪


题目描述


David是个滑雪初学者,他还没有学会如何在滑行过程中控制方向,也不知道如何停下来。所以他的滑行方式只能是在一个高高的雪堆上调整好向北,东,南或西移动的方向,然后直线滑下来,一直滑倒另一个雪堆底下才能停下来。


他发觉以这种方式,有些雪堆他是无法到达的。因此,他现在想在已有的雪堆基础上,自己再人为地增加一些雪堆,使得他可以从任何雪堆转移到其他任何雪堆。他请求您帮他找到需要创建的雪堆的最少数量。


我们假设David只能在整数坐标处堆积雪堆。


9798a0b91d5042e1995783bd28dc437e.png


输入


输入的第一行包含一个整数n(1≤n≤100),表示已有的雪堆数量。 接下来的n行中的每行包含两个整数Xi和Yi(1≤Xi,Yi≤1000),表示已有的第i个雪堆的坐标。

请注意,北方向与Oy轴方向一致,因此东方向与Ox轴方向一致。 所有雪堆的位置都不同。


输出


输出为使David能够从任何雪堆到达其他任何雪堆而需要创建的最小雪堆数。


样例输入


2

2 1

1 2


样例输出


1


题解

#include <algorithm>
#include <iostream>
#include <set>
using namespace std;
class UnionSet
{
private:
    int *roots;
    int length;
public:
    UnionSet(int n)
    {
        roots = new int[n + 1];
        for (int i = 1; i <= n; i++)
        {
            roots[i] = i;
        }
        length = n;
    }
    ~UnionSet()
    {
        delete[] roots;
    }
    int find(int a)
    {
        if(roots[a] == a)
        {
            return a;
        }else
        {
            return find(roots[a]);
        }
    }
    void merge(int a, int b)
    {
        int x = find(a);
        int y = find(b);
        if (x != y)
        {
            roots[y] = x;
        }
    }
    int count()
    {
        set<int> s;
        for (int k = 1; k <= length; k++)
        {
            s.insert(roots[k]);
        }
        return s.size();
    }
};
struct Point
{
    int x;
    int y;
};
int main()
{
    int n;
    cin >> n;
    UnionSet us(n);
    Point *point = new Point[n + 1];
    for (int i = 1; i <= n; i++)
    {
        cin >> point[i].x >> point[i].y;
    }
    for (int i = 1; i < n; i++)
    {
        for (int j = i + 1; j <= n; j++)
        {
            if (point[i].x == point[j].x || point[i].y == point[j].y)
            {
                us.merge(i, j);
            }
        }
    }
    cout << us.count() - 1 << endl;
    return 0;
}
相关文章
|
6月前
|
容器
数据结构:并查集
数据结构:并查集
62 0
数据结构:并查集
|
1月前
|
算法 开发者 计算机视觉
燃爆全场!Python并查集:数据结构界的网红,让你的代码炫酷无比!
在编程的世界里,总有一些数据结构以其独特的魅力和高效的性能脱颖而出,成为众多开发者追捧的“网红”。今天,我们要介绍的这位明星,就是Python中的并查集(Union-Find)——它不仅在解决特定问题上大放异彩,更以其优雅的设计和强大的功能,让你的代码炫酷无比,燃爆全场!
32 0
|
6月前
|
机器学习/深度学习 存储
数据结构(九)---并查集
数据结构(九)---并查集
67 5
|
2月前
|
Python
逆天改命!掌握Python并查集,数据结构难题从此不再是你的痛!
在编程旅程中,遇到棘手的数据结构难题是否让你苦恼?别担心,Python并查集(Union-Find)是你的得力助手。这是一种高效处理不相交集合合并及查询的数据结构,广泛应用于网络连通性、社交网络圈子划分等场景。通过维护每个集合的根节点,它实现了快速合并与查询。本文将介绍并查集的基本概念、应用场景以及如何在Python中轻松实现并查集,帮助你轻松应对各种数据结构挑战。
34 3
|
2月前
|
存储 C语言
数据结构基础详解(C语言): 树与二叉树的应用_哈夫曼树与哈夫曼曼编码_并查集_二叉排序树_平衡二叉树
本文详细介绍了树与二叉树的应用,涵盖哈夫曼树与哈夫曼编码、并查集以及二叉排序树等内容。首先讲解了哈夫曼树的构造方法及其在数据压缩中的应用;接着介绍了并查集的基本概念、存储结构及优化方法;随后探讨了二叉排序树的定义、查找、插入和删除操作;最后阐述了平衡二叉树的概念及其在保证树平衡状态下的插入和删除操作。通过本文,读者可以全面了解树与二叉树在实际问题中的应用技巧和优化策略。
|
2月前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
28 0
|
2月前
|
算法 开发者 计算机视觉
Python并查集:数据结构界的肌肉男,让你在编程路上无所畏惧!
在编程的浩瀚宇宙中,数据结构如同基石,构建了解决问题的坚实框架。而并查集(Union-Find),这位数据结构界的“肌肉男”,以其独特的魅力和强大的功能,让无数开发者在面对复杂关系处理时,都能感受到前所未有的从容与自信。今天,就让我们一同揭开并查集的神秘面纱,看看它是如何成为你编程路上的得力助手的。
30 0
|
2月前
|
算法 程序员 计算机视觉
Python并查集:数据结构界的肌肉男,让你在编程路上无所畏惧!
并查集,一种处理不相交集合合并与查询的数据结构,被誉为编程的“肌肉男”。它提供Find(找根节点)和Union(合并集合)操作,常用于好友关系判断、图像处理、集合合并等。Python实现中,路径压缩和按秩合并优化效率。并查集的高效性能使其成为解决问题的强大工具,助力程序员应对复杂挑战。
28 0
|
4月前
|
算法 程序员 图形学
脑洞大开!Python并查集:用最简单的方式,解决最复杂的数据结构问题!
【7月更文挑战第17天】并查集,数据结构明星,处理不相交集合合并与查询。Python实现核心操作:查找与合并。路径压缩优化查找,按秩合并保持平衡。实战应用如图连通性判断,算法竞赛利器。掌握并查集,解锁复杂问题简单解法,照亮编程之旅!
52 10
|
4月前
|
Python
告别低效!Python并查集:数据结构界的超级英雄,拯救你的编程人生!
【7月更文挑战第18天】并查集,数据结构超级英雄,用于不相交集合的合并与查询。Python实现包括初始化、查找根节点和合并操作。应用广泛,如社交网络分析、图论问题、集合划分等。示例代码展示了解决岛屿数量问题,统计连通的“1”单元格数。掌握并查集,提升编程效率,解决复杂问题。
52 6

热门文章

最新文章