实验4 在线等价类(并查集)

0x01 实验目的

掌握在线等价类的使用,要求使用模拟指针实现。

0x02 实验内容

  1. 使用模拟指针实现本实验。
  2. 输入一个1-9的正整数n,代表要创建n个元素,例如输入5,则代表创建一个1,2,3,4,5组成的元素表。
  3. 再输入一个大于0正整数r,代表后面要输入r个等价关系。
  4. 分行输入r个等价关系,格式如(1,2)。
  5. 分行输出所有等价类,一个等价类的元素由小到大依次输出。例如等价类(1,3,5,2,4),输出时排序输出(1,2,3,4,5)。
  6. 如果输出不是由小到大顺序输出,解决办法很多,可以创建一个n*n的数组,一行存放一个等价类,将所有等价类放入数组,对数组每一行元素进行排序,输出数组所有元素。

0x03 实验过程

路径压缩

采用递归的形式,将链状的结构,变成树状,每一个节点的指针域都存的是自己的祖先节点,而不仅是父节点。

int Find(int i) {if(i == node[i].next) return i;else {node[i].next = Find(node[i].next);return node[i].next;}
}

合并判断&合并顺序

  • 在合并两个类时,要判断它们的祖宗节点是否是同一个,如果是就不再合并,不是才合并。
  • order is important:必须确保两个数合并,必须由小的数指向大的数,因为在后面遍历时,如果是大的指向小的,而小的又没指向其他节点时,因为从小到大遍历的局限性,会直接将小的数当成单个类直接输出。
void unite(int m,int n) {//order is importantif(m > n) swap(m,n);int i = Find(m);int j = Find(n);if(i != j) node[i].next = j;
}

输出判断顺序

	for(int i = 1; i <= num; i++) {//order is important?if(Find(i) != i && arr[i] == false) {//cout<<i;int sum = 0;for(int j = 1; j <= num; j++) {//first 1 is specialif(arr[j] == true) continue;//first is easyif(sum == 0) {cout<<"(";cout<<j;arr[j] = true;}if(Find(j) == Find(i) && sum != 0) {cout<<","<<j;arr[j] = true;}sum++;}if(sum != 0) {cout<<")"<<endl;}} else {if(Find(i) == i && arr[i] == false) {cout<<"("<<i<<")"<<endl;arr[i] = true;}}}

括号输出问题

先输出 然后逗号跟在数字前输出,比逗号跟在数字后输出好:把第一个当成特殊情况,比把最后一个当成特殊情况要好。(最后一个在不知数量的情况下,不好判断)

if(sum == 0) {cout<<"(";cout<<j;arr[j] = true;}
if(Find(j) == Find(i) && sum != 0) {cout<<","<<j;arr[j] = true;
}

0x04 完整源码

参考视频:图论-并查集(Bilibli)

#include <bits/stdc++.h>
using namespace std;//定义节点
struct Node {int value,next;
};
Node *node;
int num;//记录是否已经被使用过
bool arr[100];//初始化,每个元素都指向自己,且值为0
void init(int sum) {num = sum;node = new Node [num + 1];for(int i = 0; i <= num; i++) {node[i].next = i;node[i].value = 0;}
}//查询祖宗节点操作
int Find(int i) {if(i == node[i].next) return i;else {node[i].next = Find(node[i].next);return node[i].next;}
}//合并节点操作
void unite(int m,int n) {//order is importantif(m > n) swap(m,n);int i = Find(m);int j = Find(n);if(i != j) node[i].next = j;
}int main() {cout<<"Input"<<endl;cin>>num;//初始化num个节点init(num);int p;cin>>p;//p个等价关系for(int i = 0; i < p; i++) {string s = "";cin>>s;unite(int(s.at(1)) - 48,int(s.at(3)) - 48);}cout<<"Output"<<endl;for(int i = 1; i <= num; i++) {//order is importantif(Find(i) != i && arr[i] == false) {//cout<<i;int sum = 0;for(int j = 1; j <= num; j++) {//first 1 is specialif(arr[j] == true) continue;//first is easyif(sum == 0) {cout<<"(";cout<<j;arr[j] = true;}if(Find(j) == Find(i) && sum != 0) {cout<<","<<j;arr[j] = true;}sum++;}if(sum != 0) {cout<<")"<<endl;}} else {if(Find(i) == i && arr[i] == false) {cout<<"("<<i<<")"<<endl;arr[i] = true;}}}cout<<"End"<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/194859.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【risc-v】易灵思efinix FPGA sapphire_soc IP配置参数分享

系列文章目录 分享一些fpga内使用riscv软核的经验&#xff0c;共大家参考。后续内容比较多&#xff0c;会做成一个系列。 本系列会覆盖以下FPGA厂商 易灵思 efinix 赛灵思 xilinx 阿尔特拉 Altera 本文内容隶属于【易灵思efinix】系列。 前言 在efinix fpga中使用riscv是一…

算法基础--双指针

前面已经写了两篇关于算法方面的文章&#xff0c;这几天想了下&#xff0c;决定把这个算法整理成一个系列&#xff0c;除了是帮助自己巩固算法知识外&#xff0c;还能够把自己总结的每种算法的套路保存下来并分享给大家&#xff0c;这样以后即使是哪天想要重拾起来&#xff0c;…

实验六 单脉冲触发中断实验(汇编与微机原理)

实验目的&#xff1a; 掌握可编程中断控制器8259一般的使用方法。 掌握8259初始化的编程方法及中断服务程序的编写方法&#xff0c;中断程序的调试方法。 实验内容&#xff1a; 用单脉冲按钮的正脉冲输出作为中断控制器8259的中断源产生中断请求&#xff0c;在中断服务程序…

Doris数据备份及恢复

Doris 支持将当前数据以文件的形式,通过 broker 备份到远端存储系统中。之后可以通过 恢复 命令,从远端存储系统中将数据恢复到任意 Doris 集群。通过这个功能,Doris 可以支持将数据定期的进行快照备份。也可以通过这个功能,在不同集群间进行数据迁移。 该功能需要 Doris 版…

【多传感器融合】BEVFusion: 多任务-多传感器融合框架 ICRA 2023

前言 BEVFusion其实有两篇, 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation ICRA 2023 | MIT提出 本文分享MIT这…

SCAU:字母分类统计

字母分类统计 Time Limit:1000MS Memory Limit:65535K 题型: 编程题 语言: G;GCC;VC 描述 输入一行以换行符结束的字符&#xff0c;统计并输出其中英文字母、数字、空格和其它字符的个数。输入格式 一行字符&#xff0c;以换行符结束输出格式 一行4个数字分别为&#…

持续集成部署-k8s-高级调度-亲和力

持续集成部署-k8s-高级调度-亲和力 1. 亲和力的基本概念2. 亲和性和非亲和性3. 节点亲和力的使用4. 节点亲和性权重5. 验证节点亲和性6. Pod 间亲和性与反亲和性7. Pod 间亲和性与反亲和性的类型8. 调度一组具有 Pod 间亲和性的 Pod9. 验证 Pod 亲和性 1. 亲和力的基本概念 在…

prometheus基础,结合node_exporter监控节点

文章目录 一、Prometheus是什么二、exporters是什么三、node_exporter四、安装 Prometheus 和 node_exporter下载运行 prometheus运行 node_exporter 五、配置 Prometheus 收集监控数据总结 一、Prometheus是什么 Prometheus 是一个开源的监控和警报工具&#xff0c;它记录任何…

Centos7安装docker、java、python环境

文章目录 前言一、docker的安装二、docker-compose的安装三、安装python3和配置pip3配置python软链接&#xff08;关键&#xff09; 四、Centos 7.6操作系统安装JAVA环境 前言 每次vps安装docker都要看网上的文章&#xff0c;而且都非常坑&#xff0c;方法千奇百怪&#xff0c…

c++ 构造

#include <iostream> using namespace std; class Coordinate { public: // 无参构造函数 // 如果创建一个类你没有写任何构造函数&#xff0c;则系统自动生成默认的构造函数&#xff0c;函数为空&#xff0c;什么都不干 // 如果自己显示定义了一…

go elasticsearch 测试实例

// 查询列表数据 func QueryOperateList(ctx context.Context, esClient *elastic.Client, index string, pageNum, pageSize int, start, end int64, execSql string, list []interface{}, operateAccount string, operateAddr string, maxRows, minRows int, dbAddr, namespa…

对象转成json后转成byte[]后在转成string会提示序列化失败,第一个字符是问号

问题复现 一个对象需要转成json 后转成byte[]后经过网络传输&#xff0c;后再次反序列化为对象&#xff0c;但是最后反序列的时候会报错&#xff0c;打印json发现开头是一个问号 省流 使用这个进行反序列化 /// <summary>/// 反序列化方法/// </summary>/// <…

Java 中如何正确的将 float 转换成 double?

为什么 double 转 float 不会出现数据误差&#xff0c;而 float 转 double 却误差如此之大&#xff1f; double d 3.14; float f (float)d; System.out.println(f);输出结果是:3.14; float f 127.1f; double d f; System.out.println(d);输出结果是&#xff1a;127.09999…

【USRP】5G / 6G 原型系统 5g / 6G prototype system

面向5G/6G科研应用 USRP专门用于5G/6G产品的原型开发与验证。该系统可以在实验室搭建一个真实的5G 网络&#xff0c;基于开源的代码&#xff0c;专为科研用户设计。 软件无线电架构&#xff0c;构建真实5G移动通信系统 X410 采用了目前流行的异构式系统&#xff0c;融合了FP…

【毕业设计】基于雷达与深度学习的摔倒检测——微多普勒效应

运动物体的微多普勒效应为人体动作识别提供了可能&#xff0c;基于雷达的居家检测具有良好的隐私保护性&#xff0c;且不易受环境因素影响&#xff08;如光照、温度等&#xff09;&#xff0c;近年来已受到国内外学者的广泛关注。由于雷达信号的非平稳特性&#xff0c;通过短时…

Oracle-CDB容器数据库修改service_names踩坑

前言: 最近在对一套Oracle容器数据库进行迁移测试时&#xff0c;为了保持新环境与旧环境的服务名一致&#xff0c;需要在新环境添加旧环境的服务名&#xff0c;在CDB的根容器通过service_name参数添加旧环境的服务名之后&#xff0c;发现数据库PDB的服务名全部被注销&#xff0…

自动驾驶学习笔记(十四)——感知算法

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 感知算法 开发过程 测试和评价 前言…

[leetcode 哈希表] 模版

文章目录 1.有效字母的异位词 E2. 两个数组的交集 E3.快乐数 E4. 两数之和 E5. **topk(前k个高频元素) M** 1.有效字母的异位词 E :::details 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 注意&#xff1a;若 s 和 t 中每个字符出现的次…

一致性哈希算法,hash(key)是负值时,会出现异常吗?

一致性哈希算法,hash(key)是负值时,会出现异常吗? 一致性哈希算法中&#xff0c;哈希函数hash(key)的返回值通常是一个非负整数。如果hash(key)返回负值&#xff0c;则可能会出现一些问题&#xff0c;例如无法正确地映射对象到哈希环上的位置&#xff0c;或者无法正确地找到…

【PTA-C语言】编程练习3 - 循环结构Ⅱ

如果代码存在问题&#xff0c;麻烦大家指正 ~ ~有帮助麻烦点个赞 ~ ~ 编程练习3 - 循环结构&#xff08;9~15&#xff09; 7-9 特殊a串数列求和&#xff08;分数 15&#xff09;7-10 穷举法搬运砖块问题&#xff08;分数 15&#xff09;7-11 数字金字塔&#xff08;分数 15&…