Codeforces 1850H:The Third Letter 带权并查集
1850H.The Third Letter
Description:
- \(n\) 个人,\(m\) 个条件,每次给出两个人 \(a_i\) 和 \(b_i\) 一维的位置关系,以距离 \(d_i\) 表示,其正负表示方位的前后,判断这 \(m\) 个条件是否矛盾。(不同的人可以在横轴上位于同一点)
Analysis:
- 将所有的横轴位置抽象为一个点,用带权并查集维护点与点之间的链接关系。
- 对于一般的并查集来说,可以维护集合内的联通关系,进而求解不同集合之间的问题(如计数等)或判断图的联通性。带权并查集主打一个边权的维护(即额外的信息)。
- 路径压缩是 \(DSU\) 的重要一环,相当于建立起每个子节点和根节点的直接关系,这便优化了查找效率,无须从某一节点持续向上递归(一旦树退化成了一条链,岂不是寄了!!)
int find(int x) {
if(x != fa[x]) fa[x] = find(fa[x]);
return fa[x];
// return fa[x] = find(fa[x])
}
- 那带权并查集呢?注意,我们要维护的不是题中所给的 \(d\),而是要动态维护起每个点到其父节点(在路径压缩下也就是根节点)的 \(w[i]\),这里就产生了对根节点有影响的两个过程:
- \(find\)(\(x\))过程:因路径压缩,节点 \(x\) 原来的 \(fa[x]\) 更新为根节点,那么 \(w[x]\) 记录的子节点到父节点的距离 也要相应更新为到根节点(也就是新的父节点)
- 合并过程:因集合合并,两个集合各自的根节点变为一个大集合的一个根节点,自然而然,其中一个集合要进行权值的更新。


Solution:
int fa[maxn];
ll w[maxn];
int find(int x) {
if(x != fa[x]) {
// 记录原来的父节点,从而记录原来的父节点 t 到根节点的距离w[t]
int t = fa[x];
fa[x] = find(fa[x]);
w[x] += w[t]; // 路径压缩的权值更新
}
return fa[x];
}
void solve() {
int n,m; cin >> n >> m;
// 初始化
for(int i=1;i<=n;i++) {
fa[i] = i; // 我是我的父亲
w[i] = 0; // 到父节点(目前是自己)的距离
}
bool flag = true; // 标记目前是否已经出现矛盾
while(m--) {
int u,v; ll d;
cin >> u >> v >> d;
if(!flag) continue;
int fu = find(u);
int fv = find(v);
if(fu != fv) {
fa[fu] = fv;
w[fu] = d + w[v] - w[u]; //集合合并的权值更新
}
else { // fu == fv 说明二者距离可求,与所给的d比较即可
if(w[u] - w[v] != d) flag = false;
}
}
if(flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
Codeforces 1850H:The Third Letter 带权并查集的更多相关文章
- Codeforces 1499G - Graph Coloring(带权并查集+欧拉回路)
Codeforces 题面传送门 & 洛谷题面传送门 一道非常神仙的题 %%%%%%%%%%%% 首先看到这样的设问,做题数量多一点的同学不难想到这个题.事实上对于此题而言,题面中那个&quo ...
- codeforces 687D Dividing Kingdom II 带权并查集(dsu)
题意:给你m条边,每条边有一个权值,每次询问只保留编号l到r的边,让你把这个图分成两部分 一个方案的耗费是当前符合条件的边的最大权值(符合条件的边指两段点都在一个部分),问你如何分,可以让耗费最小 分 ...
- Codeforces Educational Codeforces Round 5 C. The Labyrinth 带权并查集
C. The Labyrinth 题目连接: http://www.codeforces.com/contest/616/problem/C Description You are given a r ...
- Codeforces Round #181 (Div. 2) B. Coach 带权并查集
B. Coach 题目连接: http://www.codeforces.com/contest/300/problem/A Description A programming coach has n ...
- CodeForces - 687D: Dividing Kingdom II (二分图&带权并查集)
Long time ago, there was a great kingdom and it was being ruled by The Great Arya and Pari The Great ...
- Codeforces 1156D 带权并查集
题意:给你一颗树,树边的权值可能是0或1,问先走0边,再走1边,或者只走1边的路径有多少条? 思路:对于一个点,假设通过0边相连的点一共有x个(包括自己),通过1边相连的有y个(包括自己),那么对答案 ...
- Intel Code Challenge Elimination Round (Div.1 + Div.2, combined) C. Destroying Array 带权并查集
C. Destroying Array 题目连接: http://codeforces.com/contest/722/problem/C Description You are given an a ...
- 带权并查集:CF-2015 ACM Arabella Collegiate Programming Contest(F题)
F. Palindrome Problem Description A string is palindrome if it can be read the same way in either di ...
- D. The Door Problem 带权并查集
http://codeforces.com/contest/776/problem/D 注意到每扇门都有两个东西和它连接着,那么,如果第i扇门的状态是1,也就是已经打开了,那么连接它的两个按钮的状态应 ...
- POJ 1703 Find them, Catch them(带权并查集)
传送门 Find them, Catch them Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 42463 Accep ...
随机推荐
- AspNetCoreRateLimit应用于MVC项目求助
AspNetCoreRateLimit应用于MVC项目求助 前言 之前发过一篇文章: .NET Core WebApi接口ip限流实践 - 妙妙屋(zy) - 博客园 (cnblogs.com) 然后 ...
- 2021-06-03:布尔运算。给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false)、1 (true)、& (AND)、 | (OR) 和 ^ (XOR) 符号组成。
2021-06-03:布尔运算.给定一个布尔表达式和一个期望的布尔结果 result,布尔表达式由 0 (false).1 (true).& (AND). | (OR) 和 ^ (XOR) 符 ...
- nodejs 入门基本概念
nodejs 的诞生 Node.js 是2009的时候由大神 Ryan Dahl 开发的.Ryan 的本职工作是用 C++ 写服务器,后来他总结出一个经验,一个高性能服务器应该是满足"事 ...
- 【GiraKoo】Github无法打开,导致无法下载Git安装包
环境 Windows 11 原因 Git应用的安装程序在Github上,由于Github访问不稳定,导致无法下载. 对策 打开迅雷.将下载链接拷贝进去,利用迅雷的P2P技术,从其他网友处进行下载. 打 ...
- flutter填坑之旅(有状态组件StatefulWidget)
今天我们来看看flutter的StatefulWidget(有状态组件),最常用就是app 主页的底部导航栏的应用 效果图 首页 关于 我的 statefull-widget-learn .dart ...
- 微软New Bing Chat AI聊天免费体验(需要魔法~)
必应聊天是什么? Bing Chat是一个AI 聊天机器人,它可以理解您问题的上下文并以人性化的方式回复.Microsoft 已将此功能直接集成到Bing 搜索中,使 Bing 成为搜索结果和AI 支 ...
- ConcurrentHashMap是如何实现的?
众所周知 ConcurrentHashMap 是 HashMap 的多线程版本,HashMap 在并发操作时会有各种问题,比如死循环问题.数据覆盖等问题.而这些问题,只要使用 ConcurrentHa ...
- 如何更快的烹饪出美味的MOJO系列教程🔥之初识MOJO
MOJO基础入门<概述> 一,什么叫TMD的MOJO Mojo是一种编程语言,它与Python一样易于使用,但具有C++和Rust的性能.此外,Mojo提供了利用整个Python库生态系统 ...
- R 语言关于 SSL 证书异常处理笔记
一.关于 TCGAbiolinks TCGAbiolinks 是一个用于 TCGA 数据综合分析的 R/BioConductor 软件包,能够通过 GDC Application Programmin ...
- C++面试八股文:static和const的关键字有哪些用法?
某日二师兄参加XXX科技公司的C++工程师开发岗位第7面: 面试官:C++中,static和const的关键字有哪些用法? 二师兄:satic关键字主要用在以下三个方面:1.用在全局作用域,修饰的变量 ...