首页 > 其他分享 >Luogu P8710 [蓝桥杯 2020 省 AB1] 网络分析 题解 [ 绿 ] [ 带权并查集 ]

Luogu P8710 [蓝桥杯 2020 省 AB1] 网络分析 题解 [ 绿 ] [ 带权并查集 ]

时间:2024-04-03 22:14:35浏览次数:231  
标签:int 题解 查集 蓝桥 虚点 祖宗 集合 节点 网络分析

原题

分析

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

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

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

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;
}

标签:int,题解,查集,蓝桥,虚点,祖宗,集合,节点,网络分析
From: https://www.cnblogs.com/zhr0102/p/18113604

相关文章

  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第九、十章
    概述    本文主要提供《C语言程序设计》(浙大版)第九、十章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第十一、十二章节的课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客​http://......
  • 洛谷:P8671 [蓝桥杯 2018 国 AC] 约瑟夫环
    时间限制1.00s     内存限制256.00MB     难易度:普及+/提高【题目描述】n 个人的编号是1∼n,如果他们依编号按顺时针排成一个圆圈,从编号是 1 的人开始顺时针报数。(报数是从 1 报起)当报到 k 的时候,这个人就退出游戏圈。下一个人重新从 1 开始报......
  • P10296 [CCC 2024 S2] Heavy-Light Composition 题解
    思路先扫一遍,计算每个字母出现的数量,然后判断是否是交替出现。代码#include<bits/stdc++.h>usingnamespacestd;intmain(){ intT,n; cin>>T>>n; while(T--){ intt[105]={0}; strings; cin>>s; for(inti=0;i<n;i++)t[s[i]-'a&#......
  • CF1909G Pumping Lemma 题解
    题目链接题目要求我们对合法三元组进行计数,直接做是困难的,因此考虑通过枚举确定一部分元素再进行判定求解,那我们固定什么呢?固定\(x\)和\(y+z\)的分界线没啥用,因此我们枚举确定\(S\)中\(x+y\)和\(z\)的分界线,这样能确定一长串\(y^{k-1}\)所在的区间。接着我们不难想......
  • 纯小白蓝桥杯备赛笔记--DAY9(搜索)
    文章目录三道例题学会DFS剪枝什么是剪枝数字王国之军训排队--2942特殊的三角形--3008特殊的多边形--3075DFS基础回溯简介回溯法模版例题N皇后--1508小朋友崇拜圈--182全球变暖--178记忆化搜索简介斐波那契数列混境之地5-3820地宫取宝-216三道例题学会DFS剪枝什......
  • AGC066 题解
    A将网格黑白染色,将黑色格变为\(\bmod2d=0\),白色格变为\(\bmod2d=d\)。这样代价上界为\(n^2d\)。但是这样的“期望代价”是\(\frac{1}{2}n^2d\)的,考虑将黑色格变为\(\bmod2d=x\),白色格变为\(\bmod2d=d+x\),根据鸽巢原理,一定有一种方案代价在\(\frac{1}{2}n^2d......
  • 【题解】AGC008F | 思维 统计技巧 换根 二次扫描
    题意:给出一个\(n\)个点的树(边权为\(1\))和集合\(S\),求有多少个点集\(T\)可以被表示为离\(S\)中的一个点\(u\)距离不超过\(d\)的点构成的集合(下文称为\(u\)的\(d\)级邻域)。考虑\(S\)为所有点的特殊情况:我们直接求每个点邻域的个数再求和,会算重一些点集,这种情况......
  • 备战蓝桥杯之填空题技巧(持续更新)
    前言本刷题系列是我为了蓝桥杯前几天可以再系统性思考一下真题所做,所以部分内容会很简洁。如果能够帮助到你,我也会很开心!!!题目110.工作时长-蓝桥云课(lanqiao.cn)截图:excel解题:首先先点击数据排序,排好序后每两行进行计算,用后面的一行减去前面的一行,合并前两个单元格往......
  • 【洛谷 P8695】[蓝桥杯 2019 国 AC] 轨道炮 题解(映射+模拟+暴力枚举+桶排序)
    [蓝桥杯2019国AC]轨道炮题目描述小明在玩一款战争游戏。地图上一共有NNN个敌方单位,可以看作2D平面上的点。其中第i......
  • 【洛谷 P8672】[蓝桥杯 2018 国 C] 交换次数 题解(字符串+映射+全排列)
    [蓝桥杯2018国C]交换次数题目描述IT产业人才需求节节攀升。业内巨头百度、阿里巴巴、腾讯(简称BAT)在某海滩进行招聘活动。招聘部门一字排开。由于是自由抢占席位,三大公司的席位随机交错在一起,形如:ABABTATT,这使得应聘者十分别扭。于是,管理部门要求招聘方进行必要的......