食物链【并查集+不知道1是A,B,C哪一类的?用x,x+n,x+n+n分别表示A,B,C中有个1】【并查集中用距离表示关系】【压缩路径】

news2024/11/24 15:03:22

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点
蓝色文字表示:思路以及想法
 
如果大家觉得有帮助的话,感谢大家帮忙点赞!收藏!转发!

食物链

        • 法一: x,x+n,x+n+n
        • 法二:将有关系的都存储在一个部落,用到根节点的距离表示关系
          • 注意:
          • 1. 原始距离都为0
          • 2. find具有路径压缩的作用:子节点到根节点的距离 = 子节点到父节点的距离 + 父节点到根节点的距离
          • 3. A吃B则 A的父节点 等于B的父节点
        • 1. 具体步骤如图:
        • 2. 为什么有路径压缩
        • 3. 怎么处理两个根节点的距离(设数法);距离可能是负数

法一: x,x+n,x+n+n

在这里插入图片描述

思路:

  1. 因为有三种物种,A吃B,B吃C,C吃A
  2. 如果我们用一个数组存储,那么比如1吃2,那么我们让2的角标处的值标记成1,如果3吃2,那怎么标记?一个数组指定标记不过来。
  3. 那么我们想用三个数组存储,其实也存储不过来,因为角标就那么几个,
  4. 最好的方法就是,用x,x+n,x+n+n来表示
    比如1吃2,那么就可能有三种情况,
    A类中的1吃B类的2 : fa[1] = fa[2+n+n]
    B类中的1吃C类的2 : fa[1+n] = fa[2]
    C类中的1中A类的2 : fa[1+n+n] = fa[2+n];
    这样的话,就会有3*n个角标,就可以充分表达
    A中的1吃B中的2(B中的2用2+n表示)
    这样的话就不会出现数字冲突
/*

*/

#include <bits/stdc++.h>
using namespace std;
int fa[200000];
int n,m,k,x,y,ans;
int get(int x)
{
    if(x==fa[x]) 
        return x;
    return fa[x]=get(fa[x]);
}
void merge(int x,int y)
{
    fa[get(x)]=get(y);
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=3*n;i++) 
        fa[i]=i;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&k,&x,&y);
        if(x>n || y>n) 
            ans++;
        else if(k==1)
        {
            if(get(x)==get(y+n) || get(x)==get(y+n+n)) //如果x,y是同类,但是x是y的捕食中的动物,或者x是y天敌中的动物,那么错误.
                ans++;
            else
            {
                merge(x,y);
                merge(x+n,y+n);
                merge(x+n+n,y+n+n);
            }
        }
        else
        {
            if(x==y || get(x)==get(y) || get(x)==get(y+n)) //x就是y,或者他们是同类,再或者是y的同类中有x
                ans++;//都是假话
            else
            {
                merge(x,y+n+n);//y的捕食域加入x
                merge(x+n,y);//x的天敌域加入y
                merge(x+n+n,y+n);//x的捕食域是y的同类域.
            }
        }
    }
    cout<<ans<<endl;
}

法二:将有关系的都存储在一个部落,用到根节点的距离表示关系

注意:
1. 原始距离都为0
2. find具有路径压缩的作用:子节点到根节点的距离 = 子节点到父节点的距离 + 父节点到根节点的距离
3. A吃B则 A的父节点 等于B的父节点

1. 具体步骤如图:

在这里插入图片描述

2. 为什么有路径压缩

在这里插入图片描述

3. 怎么处理两个根节点的距离(设数法);距离可能是负数

在这里插入图片描述

具体过程如下:

#include <iostream>

using namespace std;

const int N = 50010;

int n, m;
int p[N], d[N];

int find(int x)
{
    if (p[x] != x)
    {
        int t = find(p[x]);
        d[x] += d[p[x]];
        p[x] = t;
    }
    return p[x];
}

int main()
{
    scanf("%d%d", &n, &m);

    for (int i = 1; i <= n; i ++ ) p[i] = i;

    int res = 0;
    while (m -- )
    {
        int t, x, y;
        scanf("%d%d%d", &t, &x, &y);

        if (x > n || y > n) res ++ ;
        else
        {
            int px = find(x), py = find(y);
            if (t == 1)
            {
                if (px == py && (d[x] - d[y]) % 3) res ++ ;
                else if (px != py)
                {
                    p[px] = py;
                    d[px] = d[y] - d[x];
                }
            }
            else
            {
                if (px == py && (d[x] - d[y] - 1) % 3) res ++ ;
                else if (px != py)
                {
                    p[px] = py;
                    d[px] = d[y] + 1 - d[x];
                }
            }
        }
    }

    printf("%d\n", res);

    return 0;
}

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

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

相关文章

jenkins项目构建类型 -----Pipeline流水线项目构建

壹&#xff0c;概念 pipeline 是一套运行在jenkins上得工作流框架&#xff0c;将原本运行于单个或者多个节点得任务连接起来&#xff0c;用来实现单个任务难以完成得复杂流程编排和可视化得工作。 贰 优点 代码持久可停止多功能可扩展 叁 如何创建Jenkins Pipeline pipeli…

计算机物联网控制|5.5常规控制方案 5.6先进控制方案

11.16日课堂作业 1.已知模拟PID算式为 试推导差分增量算式。 2.PID参数Kc、Ti、Td对系统动态特性和稳态特性有何影响&#xff1f; 目录 11.16日…

[附源码]计算机毕业设计springboot高校实验室仪器设备管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Telemetry原理

Telemetry是一种网络设备监控技术&#xff0c;提供周期采样网络设备内的统计数据和状态数据的能力。 一、Telemetry概述 1.1、技术背景&#xff1a; 网络设备的统一监控和性能管理是运维平台的重要功能&#xff0c;设备的监控数据包括数据、控制和管理平面数据。 获取设备监…

学习Python的8天

1、异常处理机制 Python 中&#xff0c;用try except语句块捕获并处理异常&#xff0c;其基本语法结构如下所示&#xff1a; try:可能产生异常的代码块 except [ (Error1, Error2, ... ) [as e] ]:#(e是别名&#xff0c;可以自己起)处理异常的代码块1 except [ (Error3, Error…

【强化学习论文合集 | 2020年合集】一. ICML-2020 强化学习论文

强化学习(Reinforcement Learning, RL),又称再励学习、评价学习或增强学习,是机器学习的范式和方法论之一,用于描述和解决智能体(agent)在与环境的交互过程中通过学习策略以达成回报最大化或实现特定目标的问题。 本专栏整理了近几年国际顶级会议中,涉及强化学习(Rein…

Workfine使用Oracle Express Edition数据库

Workfine 应用环境和工具 Win10 专业版操作系统Windows Terminaldocker desktop 4.10.1 安装设置Oracle Express Edition数据库 1、获取Oracle XE 18.4.0 docker 镜像&#xff0c;在 Windows Terminal 终端里执行如下命令 docker pull gvenzl/oracle-xe:18.4.0 2、下载成功…

小啊呜产品读书笔记001:《邱岳的产品手记-14》第26讲 写好产品文档的诀窍 第27讲 产品案例分析: QuartzHooked的对话式交互

小啊呜产品读书笔记001&#xff1a;《邱岳的产品手记-14》第26讲 写好产品文档的诀窍 & 第27讲 产品案例分析&#xff1a; Quartz&Hooked的对话式交互一、今日阅读计划二、泛读&知识摘录1、第26讲 写好产品文档的诀窍2、第27讲 产品案例分析&#xff1a; Quartz&am…

web前端-javascript-function函数(函数说明,创建和调用函数,其他方法函数声明创建函数、函数表达式创建函数)

函数 //var fun new Function("console.log(Hello 这是我的第一个函数);"); //fun();function fun2() {console.log("这是我的第二个函数");alert("哈哈哈哈");document.write("~~~~(>_<)~~~~"); }//console.log(fun2); //调用…

[附源码]计算机毕业设计springboot惠农微信小程序论文

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Nginx加载Lua脚本lrucache缓存

1、简介 lrucache缓存是单进程的&#xff0c;就像redis一样&#xff0c;所以不需要锁。 2、nginx配置 #lua_code_cache off; # 把这个缓存打开&#xff0c;因为里面的在new对象的时候&#xff0c;只允许实例一个对象&#xff0c;如果不打开的话 # 每次次请求会创建一个对象&a…

RK3588平台开发系列讲解(DisplayPort篇)DP相关模式说明

平台内核版本安卓版本RK3588Linux 5.10Android12🚀返回专栏总目录 文章目录 一、DP Alt Mode二、DP Legacy Mode2.1、Controller2.2、PHY三、Split Mode沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍DP的相关模式。

KNN最近邻算法分析及实现(Python实现)

KNN最近邻算法分析及实现&#xff08;代码附录后文&#xff09;1 KNN算法简介2 KNN基本原理3 简单实现KNN分析代码附录(Python)&#xff1a;呆&#xff0c;站住别跑&#xff0c;留个赞&#xff0c;给个关注嘛都看到这了Author&#xff1a; Nirvana Of Phoenixl Proverbs for yo…

Mysql视图和触发器

视图 视图是什么&#xff0c; 是否真实存在? 个人理解&#xff1a;视图视图&#xff0c;只是你可以看见的一层抽象层, 它并不真实存在, 而是在真实存在的一张或者多张表之上的一层封装, 对于select查询语句的提前封装. 不涉及数据的存储. 这样的一层封装好处是蛮多的. 对于…

Kamiya丨Kamiya艾美捷小鼠转铁蛋白ELISA说明书

Kamiya艾美捷小鼠转铁蛋白ELISA预期用途&#xff1a; 小鼠转铁蛋白ELISA是一种高灵敏度的双位点酶联免疫分析&#xff08;ELISA&#xff09;小鼠生物样品中转铁蛋白的测定。仅供研究使用。 引言 转铁蛋白是一种金属结合蛋白&#xff0c;可逆地与血浆中的酸溶性铁结合。它的功…

python中json的使用dump,dumps,loads,load简单了解

参考&#xff1a;https://www.runoob.com/python3/python3-json.html&#xff0c;https://zhuanlan.zhihu.com/p/264393909 json的作用 JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式 &#xff08;图片是参考链接中的图片&#xff09; json.dumps(): 对数据…

Node.js 入门教程 26 npm 依赖与开发依赖 27 Node.js 包运行器 npx

Node.js 入门教程 Node.js官方入门教程 Node.js中文网 本文仅用于学习记录&#xff0c;不存在任何商业用途&#xff0c;如侵删 文章目录Node.js 入门教程26 npm 依赖与开发依赖27 Node.js 包运行器 npx27.1 轻松地运行本地命令27.2 无需安装的命令执行27.3 使用不同的 Node.js …

[SWPUCTF 2018]SimplePHP

考点&#xff1a;文件上传 试了一下&#xff0c;直接上传php文件是不行的&#xff0c;.user.ini和.htaccess也不行 能看到有提示&#xff0c;flag在f1ag.php中 在查看文件功能处发现get传参&#xff0c;可能是文件包含 尝试包含当前页面 ?filefile.php 得到 <?php h…

一些感悟(随笔小记)

不知不觉已经坚持快70天了&#xff0c;之前虽然断断续续学过几个月但是没有形成自己的体系&#xff0c;导师安排的各种任务和课程也极大的影响了自己自学的进度&#xff0c;当时真的很迷茫。好在因为那一股冲劲制定了百日救赎计划&#xff0c;虽然在庞大的知识体系中100天真的微…

精彩回顾 | 苏州农商银行新一代云原生信息科技架构体系实践

11月18日&#xff0c;2022年第五届中国金融科技产业大会暨第四届中新&#xff08;苏州&#xff09;数字金融应用博览会“基础软件与云原生系统软件”分论坛成功举办。该论坛由由中国计算机学会CTO CLUB&#xff08;苏州&#xff09;承办&#xff0c;江苏省金融科技云原生融合创…