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

分层图 的尝试学习 1.0

分层图:
分层图的最短路:
又叫做 扩点最短路。不把实际位置看做是图上的点,而是把实际位置及其状态的组合,(一个点有若干的状态,所以一个点会扩充出来若干点)看做是图上的点,然后搜索bfs或者dijkstra的过程不变。只是扩了点(分层)而已。
原理很简单,核心在于如何扩点,如何到达,如何算距离,每个题可能都不一样。注意计算扩充之后的点数。
添加链接描述
题意:
二维网格,只包含空房间,障碍,起点,钥匙和对应的锁(只有拿到对应的钥匙才能开对应的锁,否则锁的位置和障碍没什么区别,无法通过)问获得所有钥匙所需要移动的最小次数(相当于最短路),可以上下左右移动如果无法;获得所有的钥匙,返回-1

边长最多是30,钥匙最多是6
可以用一个数来代表这个点所获得的钥匙的状态。扩充后一共有30302^6 个点。57600个点。我感觉这道题的分层的感觉不是很强烈吧,感觉更多的是状态压缩。
使用三元组 (x,y,mask)表示当前状态。其中(x,y)代表当前所处的位置,mask 是一个二进制数,长度恰好等于网格中钥匙的数量,mask的第I个二进制位为1,当且仅当,我们已经获得了网格中的第i把钥匙。
之后使用广度优先搜索。

添加链接描述
题意:
对于一个有权无向图,可以将最多k条边 化为0,问从起点到终点的最短路。
分层图,可以看成有k+1 层图,代表了 使用0次,1次…k次 的图。
图和图之间 通过权值为0的边连接。
进行扩点,最多1e5个点。
使用二维的dis ,和vis 数组来标记状态。(其中一维代表了使用了几次的免费)

dij求 最短路 的时候,越晚确定 到原点最短路 的点,点 到原点的 距离越远。也就是说 根据 节点 确定dis 的顺序,dis 的数值 是不减 的。(毕竟后面的点 是前面点 松弛过来的,然后边权非负)
所以,扩点求最短路。最先遇到这个点 某个状态时,这个dis 是这个点所有状态里面的最短。
所以 在 dij ,如果遇到了终点,那么不管他的使用过的免费次数是多少,直接返回。

#include <bits/stdc++.h>
using namespace std;
#define int long long 
const int N = 1e4 + 10;
const int M = 5e5 + 10;
int h[M], to[M], ne[M];
int w[M];int tot = 1;
struct node
{int x;int k;// 使用了多少次的 免费机会int y;// 距离bool operator<(const node &a) const{return a.y < y;}
};
void add(int u, int v, int ww)
{to[tot] = v;ne[tot] = h[u];w[tot] = ww;h[u] = tot++;
}void solve()
{int n, m, k;cin >> n >> m >> k;vector<vector<int>> dis(n, vector<int>(k + 1, 1e9));vector<vector<int>> vis(n, vector<int>(k + 1, 0));int s, e;cin >> s >> e;int u, v, ww;while (m--){cin >> u >> v >> ww;add(u, v, ww);add(v, u, ww);}auto dij = [&](int s) -> void{dis[s][0] = 0;priority_queue<node> q;q.push({s,0,0});// 代表 点,使用免费的次数 ,距离while (!q.empty()){auto tt=q.top();int u=tt.x;int j=tt.k; int cost=tt.y;q.pop();if (vis[u][j])continue;vis[u][j] = 1;if (u==e){cout<<cost<<"\n";return; }for (int i = h[u]; i; i = ne[i]){int v = to[i];// 使用 免费 的机会if (j+1<=k&&dis[v][j+1]>dis[u][j]){dis[v][j+1]=dis[u][j];q.push({v,j+1,dis[v][j+1]});}// 不使用 免费 的机会 if (dis[v][j]>dis[u][j]+w[i]){dis[v][j]=dis[u][j]+w[i];q.push({v,j,dis[v][j]});}}}};dij(s);}

上面的那种思路,其实并没有真正的构建分层图,只是用了 增加了 一维的状态。去dp
下面是 构造分层图的代码
需要构建 k+1 层。每一层都有n 个节点

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x7fffffff
const int N = 2e5;//9e5
const int M =2e7;// 9e7 
int h[N], to[M], ne[M];
int w[M], dis[N];
bool vis[N];
int tot = 1;
struct node
{int x;int y;bool operator<(const node &a) const{return a.y < y;}
};void add(int u, int v, int ww)
{to[tot] = v;ne[tot] = h[u];w[tot] = ww;h[u] = tot++;
}void dij(int s)
{fill(dis, dis + N, inf);dis[s] = 0;priority_queue<node> q;q.push({s, 0});while (!q.empty()){node u = q.top();q.pop();if (vis[u.x])continue;vis[u.x] = 1;for (int i = h[u.x]; i; i = ne[i]){int v = to[i];if (dis[v] > dis[u.x] + w[i]){dis[v] = dis[u.x] + w[i];q.push({v, dis[v]});}}}
}void solve()
{int n, m, k;cin >> n >> m >> k;int s, e;cin >> s >> e;int u, v;int ww;while (m--){// 读进来 一条边,将k+1 层,这条边都给建好cin >> u >> v >> ww;for (int j = 0; j <= k; j++){// 建 当前 层add(u+n*j, v+n*j, ww);add(v+n*j, u+n*j, ww);// 连接 这一层 和 下一层的 权值为 0的边(使用免费的票)if (j != k){add(u + n * j, v + n * (j + 1), 0);add(v + n * j, u + n * (j + 1), 0);}}}dij(s);int ans = inf;for (int j = e; j <= e+k * n; j += n)ans = min(ans, dis[j]);cout << ans << "\n";
}signed main()
{std::cin.tie(nullptr)->sync_with_stdio(false);int t = 1;//cin >> t;while (t--)solve();return 0;
}

相关文章:

分层图 的尝试学习 1.0

分层图&#xff1a; 分层图的最短路&#xff1a; 又叫做 扩点最短路。不把实际位置看做是图上的点&#xff0c;而是把实际位置及其状态的组合&#xff0c;&#xff08;一个点有若干的状态&#xff0c;所以一个点会扩充出来若干点&#xff09;看做是图上的点&#xff0c;然后搜索…...

第 31 章 javascript 之 XPath

第 31 章 XPath 1.IE 中的 XPath 2.W3C 中的 XPath 3.XPath 跨浏览器兼容 XPath 是一种节点查找手段&#xff0c;对比之前使用标准 DOM 去查找 XML 中的节点方式&#xff0c;大大降低了查找难度&#xff0c;方便开发者使用。但是&#xff0c;DOM3 级以前的标准并没有就 XPa…...

JavaScript中的高阶函数

高阶函数 所谓高阶函数&#xff0c;就是操作函数的函数&#xff0c;它接收一个或多个函数作为参数&#xff0c;并返回一个新函数&#xff1a; 来看一个mapper()函数&#xff0c;将一个数组映射到另一个使用这个函数的数组上&#xff1a; 更常见的例子&#xff0c;它接收两个函…...

Qt6.7开发安卓程序间接连接到MySQL的方法

本文主要描述一种通过间接的方法&#xff0c;使得Qt开发的安卓程序可以直连到Mysql数据库的方法。本文章的方案是通过JAVA代码去连接MySQL数据库&#xff0c;然后C代码去调用JAVA的方法&#xff0c;从而实现QT开发的安卓程序去直连到MySQL数据库。 本文使用 JDBC 结合 JNI&…...

ROW_NUMBER

How to rewrite a query which uses the ROW_NUMBER() window function in versions 5.7 or earlier before window functions were supported e.g., SELECT ROW_NUMBER() OVER (PARTITION BY fieldA) AS rownum, myTable.* FROM myTable; index 用不上的 Solution Assuming…...

Docker技术

目录 Docker的基本概念 Docker的核心原理 Docker的使用场景 Docker的优点 Docker的挑战 为什么使用 环境一致性 快速启动和部署 资源利用率高 支持微服务架构 持续集成与持续交付&#xff08;CI/CD&#xff09; 依赖管理 简化部署流程 高效资源管理 生态系统丰富…...

中小企业做网站需要考虑哪些因素?

中小企业在建设网站时&#xff0c;需要考虑的因素有很多。以下是一些主要考虑因素的介绍&#xff1a; 明确建站目的&#xff1a;中小企业需要明确自己建立网站的目的。是为了展示企业形象、推广产品&#xff0c;还是提供客户服务&#xff1f;不同的目的将决定网站的设计和功能…...

【d60】【Java】【力扣】509. 斐波那契数

思路 要做的问题&#xff1a;求F&#xff08;n&#xff09;, F&#xff08;n&#xff09;就等于F(n-1)F(n-2)&#xff0c;要把这个F(n-1)F(n-2)当作常量&#xff0c;已经得到的值&#xff0c; 结束条件&#xff1a;如果是第1 第2 个数字的时候&#xff0c;没有n-1和n-2,所以…...

项目-坦克大战学习-游戏结束

当boos受到伤害时游戏结束&#xff0c;游戏结束时我们需要将窗体全部绘制从别的画面&#xff0c;这样我们可以在游戏运行类中的update设置条件&#xff0c;在游戏运行类thread创建一个枚举类型定义是否游戏结束 public enum Game { play, over };//定义现在游戏运行状态 如果…...

MySQL基础之约束

MySQL基础之约束 概述 概念&#xff1a;约束是作用在字段的规则&#xff0c;限制表中数据 演示 # 多个约束之间不需要加逗号 # auto_increment 自增 create table user(id int primary key auto_increment comment 主键,name varchar(10) not null unique comment 姓名,age i…...

2024新版IDEA创建JSP项目

1. 创建项目 依次点击file->new->Project 配置如下信息并点击create创建项目 2. 配置Web项目 点击file->Project Structure 在点击Project Settings->Module右键右边模块名称->ADD->Web 点击Create Artifact 出现如下界面就表示配置完毕&#xff0c;…...

Conda创建,打包,删除环境相关及配置cuda

conda创建新环境Anaconda删除虚拟环境conda删除环境conda环境打包迁移及部署Python | Conda pack 进行环境打包Anaconda创建环境、删除环境、激活环境、退出环境Anaconda环境离线迁移_CondaPackError处理Anaconda环境离线迁移移植Anaconda-用conda创建python虚拟环境anaconda 配…...

Linux和指令初识

前言 Linux是我们在服务器中常用的操作系统&#xff0c;我们有必要对这个操作系统有足够的认识&#xff0c;并且能够使相关的指令操作。今天我们就来简单的认识一下这个操作的前世今生&#xff0c;并且介绍一些基础的指令操作 Linux的前世今生 要说Linux&#xff0c;还得从U…...

Vortex GPGPU的github流程跑通与功能模块波形探索(二)

文章目录 前言一、环境配置和debugging.md文档1.1 调试 Vortex GPU1.1.1测试 RTL 或模拟器 GPU 驱动的更改1.1.2 SimX 调试1.1.3 RTL 调试1.1.4 FPGA 调试1.1.5 分析 Vortex 跟踪日志 二、跑出波形文件和日志文件总结 前言 昨天另辟蹊径地去探索了子模块的波形仿真&#xff0c…...

【X线源】微焦点X射线源的基本原理

【X线源】微焦点X射线源的基本原理 1.背景2.原理 1.背景 1895年11月8日&#xff0c;德国物理学家威廉伦琴在研究阴极射线时偶然发现了X射线。当时&#xff0c;他注意到阴极射线管附近的荧光屏发出了光&#xff0c;即使它被纸板遮挡住。经过进一步实验&#xff0c;他意识到这种…...

LeetCode hot100---栈专题(C++语言)

1、有效的括号 &#xff08;1&#xff09;题目描述以及输入输出 (1)题目描述: 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。(2)输入输出描述&#xff1a; 输入&#xff1a;s "()&…...

STM32-MPU6050+DAM库源码(江协笔记)

目录 1、MPU6050简介 2、MPU6050参数 3、MPU6050硬件电路 4、MPU6050结构 5、MPU6000和MPU6050的区别 6、MPU6050应用场景 7、MPU6050电气参数 8、MPU6050时钟源选择 9、MPU6050中断源 10、MPU6050的I2C读写操作 11、DMP库移植 1、MPU6050简介 10轴传感器&#xff1…...

Ruby 数组(Array)

Ruby 数组&#xff08;Array&#xff09; 引言 Ruby&#xff0c;作为一种高级编程语言&#xff0c;以其简洁明了的语法和强大的功能而闻名。在Ruby中&#xff0c;数组&#xff08;Array&#xff09;是一种基本的数据结构&#xff0c;用于存储一系列有序的元素。本文将深入探讨…...

分享几个做题网站------学习网------工具网;

以下是就是做题网站&#xff1b;趣IT官网-互联网求职刷题神器趣IT——互联网在线刷题学习平台&#xff0c;汇集互联网大厂面试真题&#xff0c;拥有java、C、Python、前端、产品经理、软件测试、新媒体运营等多个热门IT岗位面试笔试题库&#xff0c;提供能力测评、面试刷题、笔…...

Spring MVC__入门

目录 一、SpringMVC简介1、什么是MVC2、什么是SpringMVC 二、Spring MVC实现原理2.1核心组件2.2工作流程 三、helloworld1、开发环境2、创建maven工程3、配置web.xml4、创建请求控制器5、创建springMVC的配置文件6、测试HelloWorld7、总结 一、SpringMVC简介 1、什么是MVC MV…...

当滑块验证码遇上VMP:浅析某讯前端混淆方案与自写解释器的踩坑记录

前端安全对抗新维度&#xff1a;VMP技术在滑块验证码中的实战解析 滑块验证码早已从简单的图像识别演变为复杂的人机验证系统&#xff0c;而VMP&#xff08;Virtual Machine Protection&#xff09;技术的引入&#xff0c;则将这场攻防对抗推向了更高维度。本文将深入探讨VMP如…...

构建个人数字生活数据中心:从数据采集到可视化的全栈实践

1. 项目概述&#xff1a;一个全自动化的个人数字生活记录器 最近在GitHub上看到一个挺有意思的项目&#xff0c;叫 nex-life-logger 。光看名字&#xff0c;你可能会觉得这又是一个花里胡哨的“量化自我”工具&#xff0c;无非是记录一下步数、睡眠时间。但当我深入研究了它…...

《风险背后的数学 — 第二部分》

原文&#xff1a;towardsdatascience.com/the-math-behind-risk-part-2-4a3ac74eedec?sourcecollection_archive---------4-----------------------#2024-07-03 攻击方在世界征服游戏中真的占有优势吗&#xff1f; https://medium.com/menachemrose1?sourcepost_page---byli…...

Flink窗口实战避坑指南:从AggregateFunction到ProcessWindowFunction,我踩过的那些坑

Flink窗口实战避坑指南&#xff1a;从AggregateFunction到ProcessWindowFunction的深度解析 第一次在真实项目中使用Flink窗口时&#xff0c;我像发现新大陆一样兴奋。直到凌晨三点被报警短信惊醒&#xff0c;才发现窗口计算的结果完全偏离预期——这让我意识到&#xff0c;窗口…...

LearningX:构建结构化开发者知识体系,从基础到架构的实践指南

1. 项目概述&#xff1a;一个面向开发者的系统性学习仓库最近在GitHub上看到一个挺有意思的项目&#xff0c;叫“LearningX”。光看名字&#xff0c;你可能会觉得这又是一个普通的“Awesome-XXX”列表&#xff0c;或者是一堆学习资料的简单堆砌。但当我点进去&#xff0c;花了一…...

暗黑3鼠标宏终极指南:D3KeyHelper 5步配置法快速上手

暗黑3鼠标宏终极指南&#xff1a;D3KeyHelper 5步配置法快速上手 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面&#xff0c;可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper D3KeyHelper是一款专为暗黑破坏神3玩…...

如何在Mac上轻松导出微信聊天记录:WeChatExporter完整指南

如何在Mac上轻松导出微信聊天记录&#xff1a;WeChatExporter完整指南 【免费下载链接】WeChatExporter 一个可以快速导出、查看你的微信聊天记录的工具 项目地址: https://gitcode.com/gh_mirrors/wec/WeChatExporter 你是否曾因误删重要微信聊天记录而焦虑&#xff1f…...

Nestia:基于TypeScript编译时分析的NestJS端到端类型安全实践

1. 项目概述&#xff1a;当NestJS遇上TypeScript的极致类型安全如果你正在用NestJS开发后端API&#xff0c;并且对TypeScript的类型安全有近乎偏执的追求&#xff0c;那么你很可能已经听说过&#xff0c;或者正在寻找一个能让你“写一次&#xff0c;安全两次”的工具。我说的“…...

AI驱动命令行工具:用自然语言自动化开发任务

1. 项目概述&#xff1a;一个为开发者“下厨”的AI助手如果你是一名开发者&#xff0c;每天在终端里敲打命令&#xff0c;构建、部署、调试&#xff0c;那么你肯定对重复性的命令行操作感到厌倦。比如&#xff0c;每次启动一个新项目&#xff0c;都要手动创建目录结构、初始化G…...

Qdrant客户端库实战:从向量数据库连接到生产级应用开发

1. 项目概述&#xff1a;从向量数据库到应用落地的桥梁如果你最近在折腾大模型应用&#xff0c;或者想给自己的产品加上一个“智能大脑”&#xff0c;那你大概率绕不开一个词&#xff1a;向量数据库。简单来说&#xff0c;它就像一个能理解“意思”的超级搜索引擎&#xff0c;不…...