2024/1/20 并查集

目录

并查集关键代码

亲戚

村村通

团伙(新知识)


并查集关键代码

返回祖宗节点+路径压缩:

int find(int x)
{if(f[x]!=x) f[x]=find(f[x]);return f[x];
}

合并:

void make(int x,int y)
{int f1=find(f[x]);int f2=find(f[y]);if(f1!=f2){f[f1]=f2;}
}

亲戚

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:这道题用并查集,首先输入数据,进行初始化。

如果是亲戚,就合并他们(make(int x,int y))

最后判断输入的两个数据是否返回同一个祖宗节点,如果是,则输出YES;反之输出NO。

完整代码

#include <bits/stdc++.h>
int n,m,p;
const int N = 5050;
int f[N];
int find(int x)
{if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
void make(int x,int y)
{int f1=find(f[x]);int f2=find(f[y]);if(f1!=f2){f[f1]=f2;}
}
int main()
{std::cin >> n >> m >> p;for(int i = 1;i <= n;i ++){f[i]=i;}while(m --){int x,y;std::cin >> x >> y;make(x,y);}while(p --){int x,y;std::cin >> x >> y;int x1=find(x);int y1=find(y);if(x1==y1){std::cout<<"Yes\n";}elsestd::cout<<"No\n";}return 0;
}

村村通

P1536 村村通 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:这道题用并查集,两个村庄之间每修一条路,需要修的路的条数就减少一条,最后输出还需要修的道路条数。

常识:有n个村庄,那么需要修的道路条数为n-1。

错误代码:

void make(int x,int y)
{int f1=find(x);int f2=find(y);if(f1!=f2){p[f1]=f2;}ans--;
}

ans--不应该在外面,要在if里面

如果他们祖宗节点不一样才要减一,意味着这两个村庄连接需要修一条路,一样的话就表示可以联通,答案就不用相减了

AC代码:

#include <bits/stdc++.h>
const int N = 1010;
int p[N];
int ans;
int find(int x)
{if(p[x]!=x) p[x]=find(p[x]);return p[x];
}
void make(int x,int y)
{int f1=find(x);int f2=find(y);if(f1!=f2){p[f1]=f2;ans--;}
}
int main()
{int n,m;while(std::cin >> n >> m){if(n==0){return 0;}ans=n-1;for(int i = 1;i <= n;i ++){p[i]=i;}for(int i = 1;i <= m;i ++){int x,y;std::cin >> x >> y;find(x);find(y);make(x,y);}std::cout<<ans<<"\n";}return 0;
}

团伙(新知识)

P1892 [BOI2003] 团伙 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

思路:并查集+反集

关于反集(注意合并反集的时候n+x要写在前面!!!

完整代码

#include <bits/stdc++.h>
const int N = 5050*2;
int f[N];
int ans;
int find(int x)
{if(f[x]!=x) f[x]=find(f[x]);return f[x];
}
void make(int x,int y)
{int f1=find(x);int f2=find(y);if(f1!=f2){f[f1]=f2;}
}
int main()
{int n,m;std::cin >> n >> m;for(int i = 1;i <= 2*n;i ++){f[i]=i;}for(int i = 1;i <= m;i ++){std::string s;int p,q;std::cin >> s >> p >> q;if(s=="F"){find(p),find(q);make(p,q);}else if(s=="E"){find(p+n),find(q);//反集合合并make(p+n,q);find(q+n),find(p);make(q+n,p);}}for(int i = 1;i <= n;i ++){if(f[i]==i)ans++;}std::cout<<ans;return 0;
}

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

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

相关文章

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构

spring boot shardingsphere mybatis-plus druid mysql 搭建mysql数据库读写分离架构 ##关于window mysql主从搭建简单教程 传送门 window mysql5.7 搭建主从同步环境-CSDN博客 ##父pom.xml <?xml version"1.0" encoding"UTF-8"?> <project…

c++ mysql数据库编程(linux系统)

ubuntu下mysql数据库的安装 ubuntu安装mysql&#xff08;图文详解&#xff09;-CSDN博客https://blog.csdn.net/qq_58158950/article/details/135667062?spm1001.2014.3001.5501 项目目录结构 数据库及表结构 public.h //打印错误信息 #ifndef PUBLIC_h #define PUBLIC_H…

SetFitABSA: 基于 SetFit 的少样本、方面级情感分析

SetFitABSA 是一种可以有效从文本中检测特定方面情感的技术。 方面级情感分析 (Aspect-Based Sentiment Analysis&#xff0c;ABSA) 是一种检测文本中特定方面的情感的任务。例如&#xff0c;在“这款手机的屏幕很棒&#xff0c;但电池太小”一句中&#xff0c;分别有“屏幕”和…

fabric.js 组件 图片上传裁剪并进行自定义区域标记

目录 0. 前言 1. 安装fabric与引入 2. fabric组件的使用 3. 属性相关设置 4. 初始化加载 4. 方法 5. 全代码 0. 前言 利用fabric组件&#xff0c;实现图片上传、图片”裁剪“、自定义的区域标记一系列操作 先放一张效果图吧&#x1f447; 1. 安装fabric与引入 npm i …

x-cmd pkg | mermaid - 流程图、时序图等图表绘制工具

简介 mermaid-cli 是由 Mermaid 官方提供的命令行工具&#xff0c;用于将 Mermaid 语法的文本转换为 SVG / PNG / PDF。 Mermaid 是一个基于 JavaScript 的图表绘制工具&#xff0c;它使用简单的文本描述语法&#xff0c;就可以绘制出流程图、时序图、甘特图等多种图表。 首次…

C#调用C动态链接库

前言 已经没写过博客好久了&#xff0c;上一篇还是1年半前写的LTE Gold序列学习笔记&#xff0c;因为工作是做通信协议的&#xff0c;然后因为大学时没好好学习专业课&#xff0c;现在理论还不扎实&#xff0c;不敢瞎写&#xff1b; 因为工作原因&#xff0c;经常需要分析一些字…

4496 蓝桥杯 求函数零点 简单

4496 蓝桥杯 求函数零点 简单 //C风格解法1&#xff0c;通过率100% #include <bits/stdc.h> // int a, b; 一定会自动初始化为 0int main(){int a 2, b 3; // 定义a&#xff0c;b&#xff0c;不会自动初始化&#xff0c;最好自己定义时初始化// windows环境下a值固定&…

Redis原理篇(SkipList)

一.概述 本质是双端链表&#xff0c;只不过在正向遍历时可以不一个一个遍历&#xff0c;而是可以跳着遍历。 怎么实现的呢&#xff0c;下面是SkipList源码 二.源码 1. zskiplist 意义&#xff1a;跳表 zskiplist里面有头指针和尾指针&#xff0c;节点数量&#xff0c;最大…

acwing讲解篇之93. 递归实现组合型枚举

文章目录 题目描述题解思路题解代码 题目描述 题解思路 本题相当于二叉树的深度优先遍历&#xff0c;树的第i层表示第i个数选或不选&#xff0c;当选择了m次左节点后退出 我们记录当前递归的深度deep 然后用state进行状态压缩&#xff0c;state第i位是1表示选第i个数&#xff…

Maven 依赖传递和冲突、继承和聚合

一、依赖传递和冲突 1.1 Maven 依赖传递特性 1.1.1 概念 假如有三个 Maven 项目 A、B 和 C&#xff0c;其中项目 A 依赖 B&#xff0c;项目 B 依赖 C。那么我们可以说 A 依赖 C。也就是说&#xff0c;依赖的关系为&#xff1a;A—>B—>C&#xff0c; 那么我们执行项目 …

ubuntu设置每天定时关机

ubuntu设置每天定时关机 终端输入命令&#xff1a; sudo crontab -e输入密码&#xff0c;回车。 我这里使用nano作为编辑器&#xff0c;你可以选择vim。 在末尾输入以下命令&#xff1a; 59 23 * * * sudo -u root shutdown now设置&#xff1a;每天23:59分&#xff0c;电脑…

基于springboot+vue养老院管理系统

摘要 这是一个基于Spring Boot 和 Vue.js 的养老院管理系统的项目。该系统旨在提供一套全面的解决方案&#xff0c;以简化养老院的日常管理任务&#xff0c;包括居民信息管理、员工调度、医疗服务追踪、财务管理等。通过结合后端的Spring Boot框架和前端的Vue.js框架&#xff0…