高级数据结构-并查集

例题1:

Alice和Bob玩了一个古老的游戏:首先画一个 𝑛×𝑛 的点阵(下图 n=3 )。

接着,他们两个轮流在相邻的点之间画上红边和蓝边:

1.png

直到围成一个封闭的圈(面积不必为 1)为止,“封圈”的那个人就是赢家。因为棋盘实在是太大了,他们的游戏实在是太长了!

他们甚至在游戏中都不知道谁赢得了游戏。

于是请你写一个程序,帮助他们计算他们是否结束了游戏?

输入格式

输入数据第一行为两个整数 𝑛 和 𝑚。n𝑛表示点阵的大小,𝑚 表示一共画了 𝑚 条线。

以后 𝑚 行,每行首先有两个数字 (𝑥,𝑦),代表了画线的起点坐标,接着用空格隔开一个字符,假如字符是 𝐷,则是向下连一条边,如果是 R𝑅 就是向右连一条边。

输入数据不会有重复的边且保证正确。

输出格式

输出一行:在第几步的时候结束。

假如 𝑚 步之后也没有结束,则输出一行“draw”。

数据范围

1≤𝑛≤200,
1≤𝑚≤24000

输入样例:
3 5
1 1 D
1 1 R
1 2 D
2 1 R
2 2 D
输出样
4

代码:

 小细节:二维转一维

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int n,m,ans;
int p[N];
int get(int x,int y){return x*n + y;
}
int find(int x){if(p[x] != x) p[x] = find(p[x]);return p[x];
}
signed main(){cin >> n >> m;for(int i = 0;i < n*n;i ++)p[i] = i;for(int i = 1;i <= m;i ++){int x,y;char c;cin >> x >> y >> c;x --;y --;int num1 = get(x,y);int num2;if(c == 'D'){num2 = get(x+1,y);}else {num2 = get(x,y+1);}if(find(num1) == find(num2)){ans = i;break;}p[find(num1)] = find(num2);}if(ans) cout << ans ;else cout << "draw";return 0;
}

例题2:

Joe觉得云朵很美,决定去山上的商店买一些云朵。

商店里有 n 朵云,云朵被编号为 1,2,…,n,并且每朵云都有一个价值。

但是商店老板跟他说,一些云朵要搭配来买才好,所以买一朵云则与这朵云有搭配的云都要买。

但是Joe的钱有限,所以他希望买的价值越多越好。

输入格式

第 11 行包含三个整数 n,m,w,表示有 n 朵云,m 个搭配,Joe有 𝑤 的钱。

第 2∼n+1行,每行两个整数 ci,di表示 i 朵云的价钱和价值。

第 n+2∼n+1+m 行,每行两个整数 ui,vi表示买 ui 就必须买 v𝑖,同理,如果买 vi就必须买 ui。

输出格式

一行,表示可以获得的最大价值。

数据范围

1≤𝑛≤10000,
0≤𝑚≤5000,
1≤𝑤≤10000,
1≤𝑐𝑖≤5000,
1≤𝑑𝑖≤100,
1≤𝑢𝑖,𝑣𝑖≤𝑛

输入样例:
5 3 10
3 10
3 10
3 10
5 100
10 1
1 3
3 2
4 2
输出样例:
1

代码:01背包

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int N = 1e5 + 10;
int n,m,sum;
int v[N],w[N],p[N];
int dp[N];
int find(int x){if(p[x] != x) p[x] = find(p[x]);return p[x];
}
signed main(){cin >> n >> m >> sum;for(int i = 1;i <= n;i ++)p[i] = i;for(int i = 1;i <= n;i ++)cin >> v[i] >> w[i];while(m --){int a,b;cin >> a >> b;int num1 = find(p[a]);int num2 = find(p[b]);if(num1 != num2){v[num2] += v[num1];w[num2] += w[num1];p[num1] = num2;}	}for(int i = 1;i <= n;i ++){if(p[i] == i)for(int j = sum;j >= v[i];j --)dp[j] = max(dp[j],dp[j-v[i]]+w[i]);}cout << dp[sum];return 0;
}

例题3:

在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。

考虑一个约束满足问题的简化版本:假设 𝑥1,𝑥2,𝑥3,… 代表程序中出现的变量,给定 𝑛 个形如 xi=xj𝑥𝑖=𝑥𝑗 或 xi≠xj𝑥𝑖≠𝑥𝑗 的变量相等/不等的约束条件,请判定是否可以分别为每一个变量赋予恰当的值,使得上述所有约束条件同时被满足。

例如,一个问题中的约束条件为:𝑥1=𝑥2,𝑥2=𝑥3,𝑥3=𝑥4,𝑥1≠𝑥4,这些约束条件显然是不可能同时被满足的,因此这个问题应判定为不可被满足。

现在给出一些约束满足问题,请分别对它们进行判定。

输入格式

输入文件的第 1行包含 1 个正整数 t𝑡,表示需要判定的问题个数,注意这些问题之间是相互独立的。

对于每个问题,包含若干行:

第 1 行包含 1 个正整数 n,表示该问题中需要被满足的约束条件个数。

接下来 n 行,每行包括 33个整数 i,j,e,描述 1个相等/不等的约束条件,相邻整数之间用单个空格隔开。若 e=1,则该约束条件为 xi=xj;若 e=0,则该约束条件为 xi≠xj。

输出格式

输出文件包括 𝑡 行。

输出文件的第 𝑘 行输出一个字符串 YES 或者 NOYES 表示输入中的第 𝑘 个问题判定为可以被满足,NO 表示不可被满足。

数据范围

1≤t≤10
1≤n≤10^5
1≤i,j≤10^9

输入样例:
2
2
1 2 1
1 2 0
2
1 2 1
2 1 1
输出样例:
NO
YES

代码:(离散化+并查集)

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<unordered_map>
#define int long long
using namespace std;
typedef pair<int,int> PII;
const int N = 2e5 + 10;
int T,n,cnt;
unordered_map<int,int> m;
struct NODE{int i,j,e;
}node[N];
int p[N];
int get(int x){if(m.count(x) == 0)m[x] = ++cnt;return m[x];
}
int find(int x){if(x != p[x])p[x] = find(p[x]);return p[x];
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin >> T;while(T --){cnt = 0;m.clear();cin >> n;for(int i = 0;i < n;i ++){cin >> node[i].i >> node[i].j >> node[i].e;node[i].i = get(node[i].i);node[i].j = get(node[i].j);}for(int i = 1;i <= cnt;i ++){p[i] = i;}for(int i = 0;i < n;i ++){if(node[i].e == 1){int num1 = find(node[i].i);int num2 = find(node[i].j);p[num2] = num1;}}bool flag = false;for(int i = 0;i < n;i ++){if(node[i].e == 0){int num1 = find(node[i].i);int num2 = find(node[i].j);if(num1 == num2){flag = true;break;}}}if(flag) cout << "NO" << '\n';else cout << "YES" << '\n';}return 0;
}

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

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

相关文章

Cisco网络工程师和网络安全视频教程(完整版)

0001.IT技术包括的技能 0002.课程目标.mp4 0003.Internet示意图.m 0004.局域网和广域网区 0005.服务器客户机mp4 0006.应用层和表示层.m.. 0007.会话层.mp4 0008.传输层.mp4 0009.网络层数据链路层 0010.OSI参考模型和网 0011.普换法排错.mp4 0012.OSI参考模型和网. 0013.网线和…

Mysql 插入或者更新 踩坑

最近在做电商项目&#xff0c;里面存在定时同步的代理商接口&#xff0c;接口xml里面使用了 MySQL的插入或者更新语法&#xff0c;我测试的时候老是发现数据没有更新&#xff0c;点进去才发现这个坑&#xff0c;路过的xdm 可以看下. 我的代码就不贴上来了&#xff0c;写一下具…

如何更改SSH服务器端口以减少蛮力攻击

本周有一个客户&#xff0c;购买Hostease的独立服务器&#xff0c;询问我们的在线客服&#xff0c;如何更改SSH服务器端口以减少蛮力攻击&#xff1f;我们为用户提供相关教程&#xff0c;用户很快解决了遇到的问题。在此&#xff0c;我们分享这个操作教程&#xff0c;希望可以对…

8086 汇编笔记(二):寄存器(内存访问)

一、内存中字的存储 字单元的概念&#xff1a;字单元&#xff0c;即存放一个字型数据(16 位)的内存单元&#xff0c;由两个地址连续的内存单元组成 由上一章学习可知&#xff1a;高地址内存单元中存放字型数据的高位字节&#xff0c;低地址内存单元中存放字型数据的低位字节 …

有源蜂鸣器、无源蜂鸣器区别

对比 有源蜂鸣器 1. 结构和原理 有源蜂鸣器内部自带振荡源&#xff0c;只需接通电源即可发声。内部电路会自动产生一定频率的振荡信号&#xff0c;从而驱动蜂鸣器发声。 2. 驱动方式 驱动有源蜂鸣器非常简单&#xff0c;只需要提供一个直流电源&#xff08;通常是3V、5V或…

Flutter 中的 Wrap 小部件:全面指南

Flutter 中的 Wrap 小部件&#xff1a;全面指南 Flutter 的 Wrap 是一个灵活的布局小部件&#xff0c;它允许子组件沿着主轴&#xff08;可以是水平或垂直&#xff09;排列&#xff0c;并在空间不足时换行。这种类型的布局对于创建流式布局和响应式设计非常有用。本文将详细介…

使用 VALUES 子句构建数据集

在数据库操作中&#xff0c;VALUES 子句是一个非常有用的工具&#xff0c;它可以直接在查询中创建一组值。这种方式非常适合用于临时数据的展示、测试和处理。本文将详细介绍 VALUES 子句的用法&#xff0c;并列出支持该功能的主要数据库系统。 一、VALUES 子句的基本用法 VA…

mysql语句大全及用法

MySQL是一种广泛使用的开源关系型数据库管理系统&#xff0c;它支持标准的SQL&#xff08;Structured Query Language&#xff09;语言&#xff0c;用于数据库的查询和操作。以下是一些基本的MySQL语句及其用法的概述&#xff1a; 连接MySQL数据库 mysql -h主机地址 -P端口号…

【知识拓展】机器学习基础(一):什么是预处理对象、模型对象 、pipeline、Tokenizer

前言 公司业务需要一套可离线部署的检索增强生成(RAG)大模型知识库&#xff0c;于是最近花了一周时间了解了AI相关的技术。除了查阅各类高质量技术博客&#xff0c;也自行动手进行了一些demo样例。其中包括huggingface、modelscope等平台&#xff0c;虽能使用&#xff0c;但疑惑…

扎气球最高分-第13届蓝桥杯选拔赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第74讲。 扎气球最高分&…

Spring框架温习

Spring Spring是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 Spring 特点&#xff1a; 轻量级、控制反转、面向切面、容器、框架集合 Spring 核心组件&#xff1a; Spring 常用模块&…

【Redis】 关于 Redis 有序集合类型

文章目录 &#x1f343;前言&#x1f334;普通命令介绍&#x1f6a9;zadd&#x1f6a9;zcard&#x1f6a9;zcount&#x1f6a9;zrange&#x1f6a9;zrevrange&#x1f6a9;zrangebyscore&#x1f6a9;zpopmax&#x1f6a9;zpopmin&#x1f6a9;zrank&#x1f6a9;zrevrank&…

Shell脚本的分支语句,循环语句

分支语句 if 表达式 then 命令表 fi 如果表达式为真&#xff0c;则执行命令表中的命令&#xff0c;否则退出。执行fi后的语句。 给文件权限:chmod 0777 文件名 输出: ./文件名 grep 查找用户名&#xff0c;管道wc -l 统计字符 2.多路分支语句 记得给文件名权限喔&#x…

OSPF扩展知识2

FA-转发地址 正常 OSPF 区域收到的 5 类 LSA 不存在 FA 值&#xff1b; 产生 FA 的条件: 1、5类LSA ----假设 R2为 ASBR&#xff0c;90/0 口工作的 OSPF 中&#xff0c;g0/1 口工作在非 ospf 协议或不同 ospf 进程中&#xff1b;若 g0/1 也同时宣告在和 g0/0 相同的 OSPF 进程…

R语言入门 | 使用 ggplot2 进行数据可视化

1.0准备工作 先下好tidyverse包&#xff0c;并进行加载。 install.packages ( "tidyverse" ) library(tidyverse) R 包只需安装一次&#xff0c;但每次开始新会话时都要重新加载。 1.1 数据框 数据框是变量&#xff08;列&#xff09;和观测&#xff08;行&#x…

算法练习——字符串

一确定字符串是否包含唯一字符 1.1涉及知识点 c的输入输出语法 cin>>s; cout<<"NO"; 如何定义字符串 切记&#xff1a;在[]中必须加数字——字符串最大长度&#xff0c;不然编译不通过 char s[101]; 如何获取字符串长度 char s[101];cin>>s;i…

windows10远程桌面端口,修改Windows 10远程桌面端口的步骤

在Windows 10操作系统中&#xff0c;远程桌面功能为企业用户、技术支持人员以及个人用户提供了极大的便利&#xff0c;允许他们远程访问和管理另一台计算机的桌面环境。然而&#xff0c;默认的远程桌面端口&#xff08;通常为3389&#xff09;常常成为安全漏洞的潜在目标&#…

【基础】线段树

超详解线段树(浅显易懂,几乎涵盖所有线段树类型讲解,匠心之作,图文并茂)-CSDN博客 建树 void bui(int id,int l,int r)//创建线段树,id表示存储下标,区间[L,r] {if(l r)//左端点等于右端点&#xff0c;即为叶子节点(区间长度为1)&#xff0c;直接赋值即可{tr[id] a[l];return…

【图像处理与机器视觉】图像处理概述与像素

什么是数字图像处理 改善图像信息&#xff0c;便于作出解释 方便对图像传输&#xff0c;储存&#xff0c;方便机器理解 什么是数字图像 &#xff08;1&#xff09;模拟图像&#xff1a;连续二维函数 f&#xff08;x&#xff0c;y&#xff09;表示&#xff0c;其中 x&#xf…

操作系统真象还原:一些你可能正感到迷惑的问题

第0章-一些你可能正感到迷惑的问题 这是我看操作系统真象还原这本书的一些记录&#xff1a; 4 软件是如何访问硬件的 硬件在输入输出上大体分为串行和并行&#xff0c;相应的接口也就是串行接口和并行接口。串行硬件通过串行接口与 CPU 通信&#xff0c;反过来也是&#xff…