原题

分析

本题由于从一个节点发信息,同一个集合内的所有点都会收到信息,显然是一道要求维护各节点间关系的题,因此采用并查集的数据结构进行求解。

但由于维护关系的同时还要维护权值,所以采用带权并查集,它是一种能维护某个节点与其祖宗节点之间关系的数据结构。

带权并查集找父亲的模板如下:

int findf(int x)
{
if(f[x]==x)return x;
int orif=f[x];
f[x]=findf(f[x]);
dis[x]+=dis[orif];
return f[x];
}

正常思路就是合并操作照常做,加上某个值就打上懒标记。

但是本题是否就这样结束了?

并不是,首先可以观察到本题要求的并不是简单的某节点和祖宗的关系,因为祖宗节点在和另一个集合合并之前,他们的储存信息是不互通的,如果仅仅就此进行合并,那么合并时某一个集合的储存信息就会平白无故地加上另一个集合在合并前的储存信息,这是不符合题意的。

而想要解决这个问题,就要将两个集合合并后分开来,即不能让一个集合祖宗的父亲,是另一个集合的祖宗

因此,就要让他们分居不同的子树中,自然而然地就想到了虚点的解决方法。

细节实现

对于合并操作:

先找到两个集合的祖宗节点,然后创建一个虚点,使其成为这两个祖宗节点的父节点,这样就使两个集合变成了一个集合。

同时需要注意,由于合并后并没有改变两集合内任何一个节点的储存信息,所以从祖宗节点到虚点的边权为 \(0\) 。

对于发送信息操作:

依旧是先找到这个集合的祖宗节点,然后创建一个虚点,把这个虚点作为祖宗节点的父节点。

但边权方面有所不同,这个操作由于要让集合里的所有节点都接收储存信息(包括祖宗节点),因此祖宗节点到虚点的边权为储存信息的大小 \(t\) 。

当然也可以用懒标记实现,但为了使方法统一,这里加上某个值也采用虚点的方式。

输出处理

先更新一遍它到祖宗节点的距离,即它现在存储信息的大小,这样才能保证答案正确。

然后对于每个节点 \(i\) ,输出 \(dis[i]\) 即可。

由于总操作数只有 \(10^5\) ,所以最多只会有 \(10^5\) 个虚点,最坏的情况下并查集有 \(1.1*10^5\) 个节点,时间和空间复杂度都正确。

代码

#include <bits/stdc++.h>
using namespace std;
int n,m,t,f[200005],dis[200005],cnt=20000,opt,a,b;//cnt为当前要添加的虚点的编号
void init()//初始化
{
for(int i=1;i<=200000;i++)
{
f[i]=i;
dis[i]=0;
}
}
int findf(int x)//找父节点+更新距离
{
if(f[x]==x)return x;
int orif=f[x];
f[x]=findf(f[x]);
dis[x]+=dis[orif];
return f[x];
}
void combine(int x,int y)//合并操作
{
int fx=findf(x),fy=findf(y);
f[fx]=++cnt;
f[fy]=cnt;
dis[fx]=dis[fy]=dis[cnt]=0;
}
void add(int x,int s)//发送信息操作
{
int fx=findf(x);
f[fx]=++cnt;
dis[fx]=s;
dis[cnt]=0;
}
int main()
{
init();
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>opt>>a>>b;
if(opt==1)combine(a,b);
else add(a,b);
}
for(int i=1;i<=n;i++)
{
findf(i);//更新距离
cout<<dis[i]<<' ';
}
return 0;
}

Luogu P8710 [蓝桥杯 2020 省 AB1] 网络分析 题解 [ 绿 ] [ 带权并查集 ]的更多相关文章

  1. Luogu P1196 [NOI2002]银河英雄传说:带权并查集

    题目链接:https://www.luogu.org/problemnew/show/P1196 题意: 有30000个战舰队列,编号1...30000. 有30000艘战舰,编号1...30000, ...

  2. luogu 1196 银河英雄传说 带权并查集

    带权并查集,其实有点像许多队列问情况的小学奥数 #include<bits/stdc++.h> #define rep(i,x,y) for(register int i=x;i<= ...

  3. luogu 2294 狡猾的商人 带权并查集

    此题做法多啊 带权并查集,区间dp,前缀和,差分约束 1.自己写的前缀和, 11 #include<bits/stdc++.h> #define rep(i,x,y) for(regist ...

  4. 第六届蓝桥杯软件类省赛题解C++/Java

    第六届蓝桥杯软件类省赛题解C++/Java 1[C++].统计不含4的数字统计10000至99999中,不包含4的数值个数.答:暴力循环范围内所有数字判断一下就是了,答案是52488 1[Java]. ...

  5. Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集)

    Luogu 2245 星际导航(最小生成树,最近公共祖先LCA,并查集) Description sideman做好了回到Gliese 星球的硬件准备,但是sideman的导航系统还没有完全设计好.为 ...

  6. 蓝桥杯2020.10.17B组c++

    1.门牌制作 暴力即可 #include <iostream> #include<math.h> #include<string.h> #include<st ...

  7. 蓝桥杯2020 E:七段码

    题解 正规解法是 dfs + 并查集,首先用 dfs 将其所有的情况枚举出来,再用并查集来判断是否在一个连通块上. 许多小伙伴计算的答案为76,主要是判断连通块这方面有问题,倘若不用并查集,直接枚举一 ...

  8. 第九届蓝桥杯C/C++B组题解附代码

    1.标题:第几天 2000年的1月1日,是那一年的第1天.那么,2000年的5月4日,是那一年的第几天? 125天 打开日历就ok 2. 标题:明码 汉字的字形存在于字库中,即便在今天,16点阵的字库 ...

  9. luogu P1840 Color the Axis_NOI导刊2011提高(05)|并查集

    题目描述 在一条数轴上有N个点,分别是1-N.一开始所有的点都被染成黑色.接着我们进行M次操作,第i次操作将[Li,Ri]这些点染成白色.请输出每个操作执行后剩余黑色点的个数. 输入格式 输入一行为N ...

  10. 【2020杭电多校】Total Eclipse 并查集+思维

    题目链接:Total Eclipse 题意: t组输入,给你一个由n个点,m条边构成的图,每一个点的权值是ai.你每一次可以选择一批联通的点,然后让他们的权值都减去1.问最后把所有点的权值都变成0需要 ...

随机推荐

  1. Web API 控制器的行为和操作方法的属性

    ControllerBase 类 Web API 包含一个或多个派生自 ControllerBase 的控制器类. Web API 项目模板提供了一个入门版控制器 [ApiController] [R ...

  2. [Java] Stream流使用最多的方式

    Java 中 Stream 流的用法全解析 在 Java 编程中,Stream 流提供了一种高效.便捷的方式来处理集合数据.它可以让我们以声明式的方式对数据进行各种操作,如过滤.映射.排序.聚合等,大 ...

  3. taro 编译报:模块引入顺序不一致报错

    前情 最近在开发一个小程序项目,基于公司的技术栈是React,于是使用Taro来开发小程序. 坑位 在开发中经常性的报类似如下的错误,大致意思是说你引入模块的顺序在不同模块中不一致 Why? 主要是m ...

  4. Docker启动Nacos2.4.3并且使用MySQL

    1.拉取容器 docker pull nacos/nacos-server:v2.4.3 2.创建宿主机挂载目录 mkdir -p /docker/nacos/logs/ mkdir -p /dock ...

  5. 【读书笔记】 深入理解JVM第三版 JVM 运行时数据区

    JVM 内存管理 堆 (Heap)线程共享 方法区 (Method Area)线程共享 虚拟机栈(VM Stack) 线程私有 本地方法栈 (Native Method Stack)线程私有 程序计数 ...

  6. 鸿蒙UI开发快速入门 —— part01: 装饰器&UI描述

    1. 背景 在鸿蒙开发中,ArkTS是优选的主力应用开发语言. ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集. 因此,在学习Ar ...

  7. NATS: 对象存储

    https://natsbyexample.com/examples/os/intro/dotnet2 NATS 中的对象存储能力是在 Stream 之上的一种抽象,它将消息的主题视为类似键值对中的键 ...

  8. dubbo(一)spring schema拓展技术

    https://blog.csdn.net/java_zldz_xuws/article/details/84648398 在阐述dubbo原理之前,我先介绍一下dubbo与spring怎么糅合在一块 ...

  9. vue总是报错:Trailing spaces not allowed

    翻译: Trailing spaces not allowed:不允许尾随空格 1-报错: 2-解决: 你的某些行的空格多了,删掉就行了 以我的截图为例  代码12行出错   选中12行(点击前面的1 ...

  10. 在C++中实现委托事件的方法

    参考链接: 1.在C++中模拟委托事件的方法(一) 2.利用C++的模板模拟.net的代理语法 源码学习: 1.https://pan.baidu.com/s/15vbryvzDnvmJ6FMku6_ ...