原题

分析

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

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

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

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. Codeforces Round 901 (Div

    C. Jellyfish and Green Apple 题解 显然\(n \% m =0\),答案一定为\(0\) 如果\(n > m\),我们显然可以将\(n / m\)的苹果分给每个人,然 ...

  2. 基于.NetCore开发博客项目 StarBlog - (32) 第一期完结

    前言 本文记录一下 StarBlog 项目的当前状态与接下来 v2 版本的开发规划. StarBlog 项目从 2022 年开始至今已经 2 年多了,本来早就该给第一期做个小结的,但这种博客类型的项目 ...

  3. PYENV安装与使用

    1.概述 pyenv 是一个python的版本管理软件,通过他,我们可以 方便的安装python 的版本,切换版本,解决版本不同带来问题. 2.安装pyenv 我们可以通过链接下载pyenv http ...

  4. Node.js Express 框架(2)

    1.读取文件并返回给客户端 res.sendFile(path):读取文件并返回给客户端,适合静态页面 app.get("/",function(req,res){ res.sen ...

  5. Echarts 图例组件

    1.图例组件的基本介绍 图例组件legend展现了不同系列的标记(symbol),颜色和名字.可以通过点击图例控制哪些系列不显示. 2.开启图例组件 开启图例组件默认时关闭状态,通过配置legend字 ...

  6. HTML5 多媒体

    1.互联网上的音频 直到现在,仍然不存在一项旨在网页上播放音频的标准. 今天,大多数音频是通过插件(比如 Flash)来播放的.然而,并非所有浏览器都拥有同样的插件. HTML5 规定了在网页上嵌入音 ...

  7. 构建你的.NET Aspire解决方案

    .NET Aspire 是一组功能强大的工具.模板和包,用于构建可观察的生产就绪应用程序..NET Aspire 通过处理特定云原生问题的 NuGet 包集合提供.云原生应用程序通常由小型互连部分或微 ...

  8. 使用Docker快速部署一个Net项目

    前言 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. 优点 Web 应用的自动化打包和发布. 自动化测试和 ...

  9. 使用docker部署自己的网页版chatgpt

    如果你有了一个Chat GPT账号想分享给多个人使用,最好还不用禾斗学上网别人就能访问,那么chatgpt-web这个项目可能刚好满足你的需求. 少点命令行,多点可视化,这里采用更直观的方式来搭建ch ...

  10. COSBrowser文件链接导出——爆赞的本地化管理功能

    前言 ​ 用过COSBrowser的小伙伴们应该都知道,COSBrowser的文件分享功能非常好用.但是,文件分享功能又有所局限,就是它只能分享单个文件,而文件夹分享,更有其因为部分必要因素,如安全性 ...