当前位置: 首页 > news >正文

图论(BFS)构造邻接表(运用队列实现搜索)

码蹄集OJ-夏日漫步

#include<bits/stdc++.h> 
using namespace std;
int n;
int  a[200010],dis[200010],qaq[1000010];
vector<int>son[200010];
int que[200010];
int main( )
{memset(qaq,-1,sizeof(qaq));memset(dis,-1,sizeof(dis));cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}for(int i=n;i>0;i--){if(qaq[a[i]]!=-1){son[i].push_back(qaq[a[i]]);}qaq[a[i]]=i;}for(int i=1;i<n;i++){son[i].push_back(i+1);son[i+1].push_back(i);   }int tail=2;que[1]=1;dis[1]=0;for(int i=1;i<=n;i++){int cur=que[i];for(auto v:son[cur]){if(dis[v]==-1){dis[v]=dis[cur]+1;que[tail]=v;tail++;}}}cout<<dis[n]<<endl;return 0;
}

题目表示从头开始每一个节点可以依次相连,构成一个无向图,而且跟据每一个节点的权值可以完善这个图,将权值相同的节点相连,这样题目就抽象成了图论。

由于节点少边多,所以想到运用邻接表进行BFS搜索。

构造邻接表:

    for(int i=n;i>0;i--){if(qaq[a[i]]!=-1){son[i].push_back(qaq[a[i]]);}qaq[a[i]]=i;}for(int i=1;i<n;i++){son[i].push_back(i+1);son[i+1].push_back(i);   }

qaq数组存储权值的节点值,初始化时通过memset函数将数组初始化成-1,从后向前遍历数组,如果qaq被赋值,说明在这个节点后有节点的权值与这个节点相同,将这个节点的孩子节点赋值为上一个节点值。(这种遍历方式实现了题目中人只能向后走,而且只能走到与到此节点下一个权值相同的节点)。接着将1到n个节点依次相连就行了,邻接表就构造好了。

BFS搜索过程,寻找最优路径。

    int tail=2;que[1]=1;dis[1]=0;  for(int i=1;i<=n;i++){int cur=que[i];for(auto v:son[cur]){if(dis[v]==-1){dis[v]=dis[cur]+1;que[tail]=v;tail++;}}}

令队列中存入的第一个根节点是1,从头开始遍历队列中每一个节点,队列中依次存入的是根节点的子节点。dis[i]存储的是节点i到节点1的距离,所以最后输出的是dis[n]。开始时,将dis数组初始化成-1,令dis[1]为0。在遍历队列中节点时,由于v是cur的孩子节点,所以dis[v]的值要在dia[cur]的基础下加1。为了寻找最优路径,要处理一种情况,在当前节点的孩子节点也是当前节点的根节点的孩子节点时,不对这个子节点进行路径更改,也不将子节点入队。也就是避免重复入队保证第一次到达某个节点时的路径就是最短路径

BFS 的核心特性就是:

第一次访问到某个节点时的路径长度,就是最短路径长度。

http://www.dtcms.com/a/302015.html

相关文章:

  • Java面试深度剖析:从JVM到云原生的技术演进
  • 10.若依的自定义注解 Log
  • 发布“悟能”具身智能平台,商汤让机器人像人一样和现实世界交互
  • GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【一】
  • RAGFlow系列(03):把知识库通过API方式共享给Dify等外部平台使用
  • WPS 将一个PPT里面的图片和文字导入到另一个PPT中
  • CSP-J 2022_第三题逻辑表达式
  • 面试官:详细说说Kafka rebalance 的策略以及具体过程
  • 中国计算机学会(CCF)推荐学术会议-B(数据库/数据挖掘/内容检索):WSDM 2026
  • Rust并发编程中的所有权挑战与解决方案:从实际项目看Clone策略的应用
  • vue3卡片垂直无限滚动
  • Android 中 TCP 协议的实战运用
  • 【JAVA安全-Fastjson系列】Fastjson 1.2.24 反序列化漏洞分析及测试环境构建【复习回顾】
  • 安宝特案例丨户外通信机房施工革新:AR+作业流技术破解行业难题
  • 安宝特案例丨AR+AI赋能轨道交通制造:破解人工装配难题的创新实践
  • AR技术赋能工业设备维护:效率与智能的飞跃
  • keeplived实例
  • 基于Verilog的神经网络加速器设计
  • 微信小程序点击输入框时,顶部导航栏被遮挡问题如何解决?
  • 数值计算 | 图解基于龙格库塔法的微分方程计算与连续系统离散化(附Python实现)
  • 软件测试开发转型经验分享与职业发展指南
  • 基于FPGA和DDS原理的任意波形发生器(含仿真)
  • 可配置的PWM外设模块
  • Java Collections工具类
  • RocketMQ入门实战详解
  • 【MySQL学习|黑马笔记|Day1】数据库概述,SQL|通用语法、SQL分类、DDL
  • 【数据标注】详解使用 Labelimg 进行数据标注的 Conda 环境搭建与操作流程
  • 【unitrix】 6.20 非零整数特质(non_zero.rs)
  • 做了一款小而美的本地校验器
  • 【保姆级喂饭教程】Python依赖管理工具大全:Virtualenv、venv、Pipenv、Poetry、pdm、Rye、UV、Conda、Pixi等