网络分析(蓝桥杯,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的父节点是根节点,则返回x
    int 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的父节点是根节点,则返回x
    int 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JAVAEE——多线程的设计模式,生产消费模型,阻塞队列

文章目录 多线程设计模式什么是设计模式单例模式饿汉模式懒汉模式线程安全问题懒汉模式就一定安全吗&#xff1f;锁引发的效率问题jvm的优化引起的安全问题 阻塞队列阻塞队列是什么&#xff1f;生产消费者模型阻塞队列实现消费生产者模型可能遇到的异常 多线程设计模式 什么是…

【PHP + 代码审计】数组函数

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【Java、PHP】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收…

安全工具介绍 SCNR/Arachni

关于SCNR 原来叫Arachni 是开源的&#xff0c;现在是SCNR&#xff0c;商用工具了 可试用一个月 Arachni Web Application Security Scanner Framework 看名字就知道了&#xff0c;针对web app 的安全工具&#xff0c;DASTIAST吧 安装 安装之前先 sudo apt-get update sudo…

力扣面试150 阶乘后的零 数论 找规律 质因数

Problem: 172. 阶乘后的零 思路 &#x1f468;‍&#x1f3eb; 大佬神解 一个数末尾有多少个 0 &#xff0c;取决于这个数 有多少个因子 10而 10 可以分解出质因子 2 和 5而在阶乘种&#xff0c;2 的倍数会比 5 的倍数多&#xff0c;换而言之&#xff0c;每一个 5 都会找到一…

AWTK T9 输入法实现原理

1. T9 输入法的中文字典数据 网上可以找到 T9 输入法的中文字典数据&#xff0c;但是通常有两个问题&#xff1a; 采用 GPL 协议&#xff0c;不太适合加入 AWTK。 只支持单个汉字的输入&#xff0c;不支持词组的输入。 经过考虑之后&#xff0c;决定自己生成 T9 输入法的中…

选择器加练习

一、常用的选择器 1.元素选择器 语法 : 标签名{} 作用 : 选中对应标签中的内容 例:p{} , div{} , span{} , ol{} , ul{} ...... 2.类选择器(class选择器) 语法 : .class属性值{} 作用 : 选中对应class属性值的元素 注意:class里面的属性值不能以数字开头,如果以符号开头,…

基于python+vue城市交通管理系统的设计与实现flask-django-php-nodejs

此系统设计主要采用的是python语言来进行开发&#xff0c;采用django/flask框架技术&#xff0c;框架分为三层&#xff0c;分别是控制层Controller&#xff0c;业务处理层Service&#xff0c;持久层dao&#xff0c;能够采用多层次管理开发&#xff0c;对于各个模块设计制作有一…

Docker 镜像仓库

目录 1、搭建私有 registry 服务端创建镜像仓库 客户端推送镜像 镜像导入导出 2、Nginx 代理 registry 仓库 SSL 证书 & https 协议 SSL证书 https协议 SSL 的验证流程 客户端安装 Nginx 使用 openssl 生成CA根证书和根证书key 创建 Nginx 服务证书 配置启动 N…

线段树和树状数组

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 树状数组和线段树1.树状数组1.1动态求连续区间和1.2数…

c#矩阵求逆

目录 一、矩阵求逆的数学方法 1、伴随矩阵法 2、初等变换法 3、分块矩阵法 4、定义法 二、矩阵求逆C#代码 1、伴随矩阵法求指定3*3阶数矩阵的逆矩阵 &#xff08;1&#xff09;伴随矩阵数学方法 &#xff08;2&#xff09;代码 &#xff08;3&#xff09;计算 2、对…

Unity Shader

练习项目链接 1. Shader 介绍 Shader其实就是专门用来渲染图形的一段代码&#xff0c;通过shader&#xff0c;可以自定义显卡渲染画面的算法&#xff0c;使画面达到我们想要的效果。小到每一个像素点&#xff0c;大到整个屏幕&#xff0c;比如下面这个比较常见的效果。 2. Sh…

javaSwing宿舍管理系统(三个角色)

一、 简介 宿舍管理系统是一个针对学校宿舍管理的软件系统&#xff0c;旨在方便学生、宿管和管理员进行宿舍信息管理、学生信息管理以及宿舍评比等操作。该系统使用 Java Swing 进行界面设计&#xff0c;分为三个角色&#xff1a;管理员、宿管和学生。 二、 功能模块 2.1 管…

RK3568平台 iperf3测试网络性能

一.iperf3简介 iperf是一款开源的网络性能测试工具&#xff0c;主要用于测量TCP和UDP带宽性能。它可以在不同的操作系统上运行&#xff0c;包括Windows、Linux、macOS等。iperf具有简单易用、功能强大、高度可配置等特点&#xff0c;广泛应用于网络性能测试、网络故障诊断和网…

深度学习绘制热力图heatmap、使模型具有可解释性

思路 获取想要解释的那一层的特征图&#xff0c;然后根据特征图梯度计算出权重值&#xff0c;加在原图上面。 Demo 加上类激活(cam) 可以看到&#xff0c;cam将模型认为有利于分类的特征标注了出来。 下面以ResNet50为例: Trick: 使用 for i in model._modules.items():可以…

二十三 超级数据查看器 讲解稿 设置

二十三 超级数据查看器 讲解稿 设置 ​点击此处 以新页面 打开B站 播放当前教学视频 点击访问app下载页面 百度手机助手 下载地址 大家好&#xff0c;这节课我们讲一下&#xff0c;超级数据查看器的设置功能。 首先&#xff0c;我们打开超级数据查看器&#xff0c; 我…

2023年全国青少年信息素养大赛(python)初赛真题

选择题&#xff08;每题5分&#xff0c;共20题&#xff0c;满分100分&#xff09; 1、关于列表的索引&#xff0c;下列说法正确的是&#xff1f; A&#xff0e;列表的索引从0开始 B&#xff0e;列表的索引从1开始 C&#xff0e;列表中可能存在两个元素的索引一致 D&#xff0…

第四百一十九回

文章目录 1. 概念介绍2. 思路与方法2.1 实现思路2.2 实现方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"自定义标题栏"相关的内容&#xff0c;本章回中将介绍自定义Action菜单.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在这里提到的…

web自动化3-pytest前后置夹具

一、pytest前后置&#xff08;夹具&#xff09;-fixture 夹具的作用&#xff1a;在用例执行之前和之后&#xff0c;需要做的准备工作和收尾工作。 用于固定测试环境&#xff0c;以及清理回收资源。 举个例子&#xff1a;访问一个被测页面-登录页面&#xff0c;执行测试用例过…

SpringCloud-Gateway服务网关

一、网关介绍 1. 为什么需要网关 Gateway网关是我们服务的守门神&#xff0c;所有微服务的统一入口。 网关的核心功能特性&#xff1a; 请求路由 权限控制 限流 架构图&#xff1a; 权限控制&#xff1a;网关作为微服务入口&#xff0c;需要校验用户是是否有请求资格&am…

算法-双指针

目录 1、双指针遍历分割:避免开空间&#xff0c;原地处理 2、快慢指针&#xff1a;循环条件下的判断 3、左右指针&#xff08;对撞指针&#xff09;&#xff1a;分析具有单调性&#xff0c;避免重复计算 双指针又分为双指针遍历分割&#xff0c;快慢指针和左右指针 1、双指…