网络分析(蓝桥杯,acwing,并查集)

 题目描述:

小明正在做一个网络实验。

他设置了 n 台电脑,称为节点,用于收发和存储数据。

初始时,所有节点都是独立的,不存在任何连接。

小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。

两个节点如果存在网线连接,称为相邻。

小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。

所有发送和接收的节点都会将信息存储下来。

一条信息只存储一次。

给出小明连接和测试的过程,请计算出每个节点存储信息的大小。

输入格式:

输入的第一行包含两个整数 n,m,分别表示节点数量和操作数量。

节点从 1 至 n 编号。

接下来 m 行,每行三个整数,表示一个操作。

  • 如果操作为 1 a b,表示将节点 a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。
  • 如果操作为 2 p t,表示在节点 p 上发送一条大小为 t 的信息。

输出格式:

输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 1 至节点 n 上存储信息的大小。

数据范围:

1≤n≤10000
1≤m≤1e5
1≤t≤100

输入样例1:

4 8
1 1 2
2 1 10
2 3 5
1 4 1
2 2 2
1 1 2
1 2 4
2 2 1

输出样例1:

13 13 5 3

分析步骤:

  第一:这道题目是要确定哪些电脑是连接到了一起,哪些电脑是在同一个集合之中,所以应该运用并查集,将其要连接的合并;我们要计算到底储存了多少的信息,其实只要看这个点和根节点的距离到底有多少,如果是根节点的话则直接输出他的值,否则应该输出自身的值加上根节点的值

 第二:书写主函数,构建整体框架:

             将值输入,并查集数组更新自身,将自己设为自己的根节点。

             进行判断如果操作是1的话则,去查找a , b 的父节点,如果a的父节点 != b的父节点 那么就将 d[a] 的值减去d[b]的值。它的作用是在合并操作中更新节点 a 的距离。由于在并查集合并时,将集合 a 合并到集合 b 中,所以要更新集合 a 中所有节点的距离,使其相对于根节点的距离保持一致。因此,这行代码的目的是将集合 a 中的每个节点的距离减去集合 b 的距离,以实现更新。这样,在输出结果时才能得到正确的距离信息。最后将a的父节点改为b。

             进行判断如果操作是2的话则,去将a的集合根节点加上b。

             用for循环判断如果是根节点则直接输出他的值,否则则输出自身的值加上根节点的距离


int main()
{scanf("%d%d", &n, &m);  // 读取节点数和操作数for (int i = 1; i <= n; i ++ ) p[i] = i;  // 初始化并查集的父节点为自身while (m -- ){int t, a, b;scanf("%d%d%d", &t, &a, &b);  // 读取操作类型和操作数if (t == 1){a = find(a), b = find(b);  // 查找a和b所属的集合的根节点if (a != b)  // 如果a和b不在同一个集合中{d[a] -= d[b];  // 更新a的距离p[a] = b;  // 将a所属的集合合并到b所属的集合中}}else{a = find(a);  // 查找a所属的集合的根节点d[a] += b;  // 更新a所属集合中的所有节点的距离(距离增加b)}}for (int i = 1; i <= n; i ++ )if ( i == find(i) ) printf("%d ", d[i]);  // 输出根节点的距离else printf("%d ", d[i] + d[find(i)]);  // 输出非根节点的距离(距离需要累加)puts("");return 0;
}

  第四:书写find函数

              判断x点的父节点是否是自身,不是的话就不断的向上递归去找寻真正的根节点(也就是最祖宗的那个节点)进行路径压缩

// 并查集的查找函数
int find(int x)
{if (p[x] == x || p[p[x]] == p[x]) return p[x];  // 如果x是根节点或者x的父节点是根节点,则返回xint r = find(p[x]);  // 递归查找x的根节点// 路径压缩,将x的父节点更新为根节点,同时更新距离d[x] += d[p[x]];p[x] = r;return r;
}

        

  第五:这是我给大家画的样例图片,大家可以好好照着理解一下,理解一下什么是路径压缩,他是运用递归的思想,不断向上去寻找最根节点的根节点在哪里 , 找到了之后我们就依次返回,最终将路径上的每个点的父节点都变为根节点 

代码:

#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;const int N = 10010;int n, m;
int p[N], d[N];// 并查集的查找函数
int find(int x)
{if (p[x] == x || p[p[x]] == p[x]) return p[x];  // 如果x是根节点或者x的父节点是根节点,则返回xint r = find(p[x]);  // 递归查找x的根节点// 路径压缩,将x的父节点更新为根节点,同时更新距离d[x] += d[p[x]];p[x] = r;return r;
}int main()
{scanf("%d%d", &n, &m);  // 读取节点数和操作数for (int i = 1; i <= n; i ++ ) p[i] = i;  // 初始化并查集的父节点为自身while (m -- ){int t, a, b;scanf("%d%d%d", &t, &a, &b);  // 读取操作类型和操作数if (t == 1){a = find(a), b = find(b);  // 查找a和b所属的集合的根节点if (a != b)  // 如果a和b不在同一个集合中{d[a] -= d[b];  // 更新a的距离p[a] = b;  // 将a所属的集合合并到b所属的集合中}}else{a = find(a);  // 查找a所属的集合的根节点d[a] += b;  // 更新a所属集合中的所有节点的距离(距离增加b)}}for (int i = 1; i <= n; i ++ )if ( i == find(i) ) printf("%d ", d[i]);  // 输出根节点的距离else printf("%d ", d[i] + d[find(i)]);  // 输出非根节点的距离(距离需要累加)puts("");return 0;
}

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

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

相关文章

202312 CSP认证 | 树上搜索

树上搜索 这题算是寒假期间自己先写了一遍&#xff0c;当时是20分超时了 当时的存储思路是&#xff0c;存储每一个节点的所有后代节点&#xff0c;然后在找到wsigma最小的节点之后用的集合操作。这导致了一个问题&#xff1a; 更新维护成本很高。每删除一个分支&#xff0c;都…

python 爬虫爬取地理空间高程图GDEMV2 30m 中国地形

一.配置Python 爬虫 环境 from selenium import webdriver import time # from selenium.webdriver.common.action_chains import ActionChains from selenium.webdriver.common.by import Byfrom selenium.webdriver.common.keys import Keys # from selenium.webdriver.comm…

Linux命令总结

1.目录切换 #切换到该目录下 usr 目录 cd usr #切换到上一层目录 cd ../ cd .. #切换到系统根目录 cd / #切换到用户主目录 cd ~ #切换到上一个操作所在目录 cd -2.目录操作 #显示目录中的文件和子目录的列表 ls /usr #目录下的所有目录和文件的详细信息 ll /usr #创建新目录…

【鸿蒙系统】 ---OpenHarmony加快本地编译(二)

&#x1f48c; 所属专栏&#xff1a;【鸿蒙系统】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢…

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别

分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别 目录 分类预测 | Matlab实现MTF-CNN-Mutilhead-Attention马尔可夫转移场卷积网络多头注意力机制多特征分类预测/故障识别分类效果基本介绍模型描述程序设计参考…

sqlalchemy和moke生成实体类(一)

前言 如果通过java生成实体类&#xff0c;可以通过mybatis或者mybatis-plus的generator。 而sqlalchemy也可以生成实体类&#xff0c;通过sqlalcodegen或者flask-sqlalcodegen。 使用flask-sqlalcodegen生成实体类 建表 建立学生表&#xff0c;如下。 create table stude…

【Android】系统启动流程分析 —— init 进程启动过程

本文基于 Android 14.0.0_r2 的系统启动流程分析。 一、概述 init 进程属于一个守护进程&#xff0c;准确的说&#xff0c;它是 Linux 系统中用户控制的第一个进程&#xff0c;它的进程号为 1&#xff0c;它的生命周期贯穿整个 Linux 内核运行的始终。Android 中所有其它的进程…

Machine Learning - Logistic Regression

目录 一、Activation Function Why introduce activation functions? There are several commonly used activation functions: 二、Sigmoid&#xff1a; 三、Logistic Regression Model&#xff1a; 四、Implementation of logistic regression&#xff1a; 五、Decis…

unity 多屏幕操作

想了解基础操作请移步&#xff1a;&#xff08;重点是大佬写的好&#xff0c;这里就不再赘述&#xff09; Unity 基础 之 使用 Display 简单的实现 多屏幕显示的效果_unity display-CSDN博客 在panel上也可以通过获取 Canvas&#xff0c;来达到切换多屏幕的操作&#xff0c; …

Pear-rec:一键开启多功能捕捉分享,告别繁琐操作!

Pear-rec&#xff1a;一键捕捉每一刻&#xff0c;让每一次分享变得简单高效 - 精选真开源&#xff0c;释放新价值。 概览 Pear-rec是一款采用先进的Electron框架构建&#xff0c;并以ReactJS为前端技术基础的跨平台桌面应用&#xff0c;专注于提供全方位的屏幕捕捉与媒体处理功…

【C++】类与对象(下篇)

在本篇博客中&#xff0c;作者将会讲解类与对象的最后一篇。 一.再谈构造函数 在类与对象&#xff08;上篇&#xff09;中&#xff0c;我们讲到了构造函数&#xff0c;其实构造函数就是给每个成员变量进行赋值&#xff01;&#xff01;&#xff01; 仅仅只是赋值而已&#xf…

阿里云2核4G服务器支持多少人在线?2C4G多少钱一年?

2核4G服务器支持多少人在线&#xff1f;阿里云服务器网账号下的2核4G服务器支持20人同时在线访问&#xff0c;然而应用不同、类型不同、程序效率不同实际并发数也不同&#xff0c;2核4G服务器的在线访问人数取决于多个变量因素。 阿里云2核4G服务器多少钱一年&#xff1f;2核4…

地宫取宝dfs

分析&#xff1a; 矩阵里的每一个位置都有标记&#xff0c;要求的问题是&#xff1a;有几种方法能完成这个规定。 那么&#xff0c;我们只需要计算从开始(1,1)到最后(n,m)的深度优先搜索中&#xff0c;有几个是满足要求的即为正确答案。 有个要求是&#xff0c;如果一个格子中…

Docker-镜像仓库

Docker ⛅Docker-Registry&#x1f320;分类&#x1f320;镜像仓库工作机制&#x1f320;常用的镜像仓库&#x1f320;镜像仓库命令☃️docker login☃️docker pull☃️docker push☃️docker search☃️docker logout &#x1f320;镜像命令[部分]☃️docker images☃️docke…

Git工具的详细使用

一、环境说明 [rootgit ~]# getenforce Disabled [rootgit ~]# systemctl status firewalld ● firewalld.service - firewalld - dynamic firewall daemonLoaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)Active: inactive (d…

网络安全实训Day9

写在前面 访问控制和防火墙桌面端安全检测与防御 网络安全实训-网络安全技术 网络安全概述 访问控制 定义&#xff1a;通过定义策略和规则来限制哪些流量能经过防火墙&#xff0c;哪些流量不能通过。本质是包过滤 可以匹配的元素 IP协议版本 源区域和目的区域 源IP地址和目…

【赠书活动】Python编程 从入门到实践 第3版(图灵出品)(文末送书-进行中)

编辑推荐 适读人群 &#xff1a;本书适合对Python感兴趣的所有读者阅读。 编程入门就选蟒蛇书&#xff01; 【经典】Python入门经典&#xff0c;常居Amazon等编程类图书TOP榜 【畅销】热销全球&#xff0c;以12个语种发行&#xff0c;影响超过 250 万读者 【口碑】好评如潮…

2-dubbo源码 : 源码环境搭建

好的开始是成功的一半&#xff0c;阅读源码也是一样。 很多同学在下定决心阅读一个开源框架之后&#xff0c;就一头扎进去&#xff0c;迷失在代码“迷宫”中。此时&#xff0c;有同学意识到&#xff0c;需要一边 Debug 一边看&#xff1b;然后又有一批同学在搭建源码环境的时候…

学习C++是否有必要学习Boost库?

C作为一门强大且灵活的编程语言&#xff0c;在软件开发领域有着广泛的应用。而在C的学习过程中&#xff0c;Boost库是一个经常被提及的重要资源。那么&#xff0c;对于C的学习者而言&#xff0c;是否有必要投入精力去学习Boost库呢&#xff1f;本文将就此问题展开详尽讨论。 一…

论文:Zero-Shot Entity Linking by Reading Entity Descriptions翻译笔记(阅读实体描述、实体链接)

文章目录 论文题目&#xff1a;通过阅读实体描述实现零样本实体链接摘要1 介绍2 零点实体链接2.1 审查&#xff1a; 实体链接2.2 任务定义2.3 与其他 EL 任务的关系 3 数据集构建4 实体链接模型4.1 生成候选4.2 候选排序 5 适应目标世界6 实验6.1 基线6.2 对未知实体和新世界6.…