J - 食物链 POJ - 1182

简介: J - 食物链 POJ - 1182

一些话

这b题目细节太多了,对刚起步的新人非常不友好,写的我想紫砂

写题时得画图理解


流程

带权并查集:食物链

父节点数组,距离数组


find函数:


//由于是将所有节点的指向根节点,而只有最上层的节点是直接指向根节点,所以是自上而下的操作,自下而上的递归。


如果f[x] != x


//储存find(f(x))


int t = find(fx);


//自上而下递归保证d[x]原本储存的是x到f[x]的距离,d[f[x]] 储存的是f[x]到根节点的距离


d[x] += d[f[x]];


f[x] = t;


//由于是自上而下的操作,所以操作写在递归语句后


返回f[x]


//由于是改变f[x] 的值,所以返回值也是f[x]


main函数:


读入n,m


初始化父节点数组


cnt声明


int cnt = 0;


while(m--){


读入op,x,y;


如果x或y>n,假话


else{


fx = find(x),fy = find(y);


如果op是1,


image.png

如果x,y不在一个集合,将x集合插到y中


//注意不能直接用else,要else if(fa != fb)确定是因为不在一个集合才没有进入上一条if语句


x根节点的父节点设为y的根节点(即f[x] = x的形式)


x原根节点到新根节点的距离d[x]设为y到根节点距离-x到原根节点距离(根节点变更,所以d[x] + d[fx] 才和d[y]相等,下面同理)


d[fx] = d[y] - d[x];


如果op是2,


如果x,y在同一个集合(根节点相同)且x和y到根节点距离差 - 1 再模3不为零,假话


如果x,y不在一个集合,将x集合插到y中


x根节点的父节点设为y的根节点(即f[x] = x的形式


x原根节点到新根节点的距离d[f[x]设为y到根节点距离-x到原根节点距离


}


输出假话数


return 0;


}


套路

带有维护信息的路径压缩

条件:并查集中要维护信息

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

ac代码

#include <iostream>
using namespace std;
const int N = 5e4 + 10;
int f[N],d[N];
int find(int x){
  if(f[x] != x){
    d[x] += d[f[x]];
    f[x] = find(f[x]);
  }
  return f[x];
}
int main(){
  int n,m;
  scanf("%d%d",&n,&m);
  for(int i = 1;i <= n;i++) f[i] = i;
  int cnt = 0;
  while(m--){
    int op,a,b;
    scanf("%d%d%d",&op,&a,&b);
    if(a > n || b > n){
      cnt++;
    }
    else{
      int fa = find(a);
      int fb = find(b);
      if(op == 1){
        if(fa == fb && (d[a] - d[b]) % 3) cnt++;
        else if(fa != fb) {
          f[fa] = fb;
          d[fa] = d[b] - d[a];
        }
      }
      else {
        if(fa == fb && (d[a] - d[b] - 1) % 3) cnt++;
        else if(fa != fb){
          f[fa] = fb;
          d[fa] = d[b] - d[a] + 1;
        }
      }
    }
  }
  printf("%d\n",cnt);
  return 0;
}
目录
相关文章
|
Rust 开发工具 git
日志高亮 | notepad
日志高亮 | notepad
391 7
|
数据采集 机器学习/深度学习 自然语言处理
命名实体识别的一点经验与技巧(下)
命名实体识别的一点经验与技巧(下)
206 0
|
存储 编解码 安全
阿里云视频点播简介和购买流程
阿里云视频点播是阿里巴巴集团旗下的一项强大的视频云服务,为用户提供在线视频上传、存储、转码、播放等全方位的视频解决方案。作为中国最大的云计算服务提供商,阿里云视频点播在视频领域拥有丰富的技术实力和经验,为用户提供高效、可靠、安全的视频服务。
|
10月前
|
安全 Linux 数据库
|
6月前
|
存储 缓存 Java
极速启动,SAE弹性加速全面解读
在云计算快速发展的今天,业务稳定性与响应速度成为企业竞争力的关键。阿里云Serverless应用引擎(SAE)通过镜像加速、启动加速及CPU Burst等核心技术,大幅提升弹性能力。其中,镜像加速利用预热机制与按需加载技术减少拉取时间;启动加速针对Java应用优化,采用Dragonwell 11的Quickstart能力和Wisp2协程技术;CPU Burst则在应用启动阶段临时提升CPU规格,确保高效运行。
极速启动,SAE弹性加速全面解读
|
11月前
|
前端开发 JavaScript Go
JS基础:输出信息的5种方式详解
JS基础:输出信息的5种方式详解
186 1
|
开发工具 Android开发 iOS开发
搭建Flutter开发环境、从零基础到精通
搭建Flutter开发环境、从零基础到精通
|
移动开发 安全 Android开发
安卓与iOS开发环境的差异及其对开发者的影响
【8月更文挑战第23天】移动应用开发领域,安卓和iOS两大平台各占半壁江山。它们在开发环境上的差异不仅影响了开发流程,还深刻地塑造了开发者的工作方式。本文将探讨这些差异,并分析它们如何影响开发者的决策和产品的质量。
|
Cloud Native API 持续交付
构建未来:云原生架构在企业数字化转型中的关键作用
随着企业加速其数字化转型的步伐,云原生架构已成为实现敏捷性、可扩展性和弹性的关键技术。本文将深入探讨云原生技术的核心组件,包括容器化、微服务、持续集成与持续部署(CI/CD)、以及声明式API,并分析它们如何共同促进企业的技术创新和业务增长。通过采用云原生方法,组织能够更快速地响应市场变化,提高运营效率,并在竞争激烈的市场中保持领先地位。
|
传感器 内存技术
毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计
毕业设计 江科大STM32的智能温室控制蓝牙声光报警APP系统设计
425 0

热门文章

最新文章