HDU4725 - The Shortest Path in Nya Graph (Dijstra + 建图)

Pytest教程:Pytest插件原理 Pytest的插件系统是其强大功能的核心,它允许用户和开发者扩展和定制测试框架的行为。要深入理解Pytest插件的原理,我们需要从Pytest的架构和设计模式开始,然后深入到底层源码。 阅读详情

题目链接:

http://acm.hdu.edu.cn/showproblem.php?pid=4725


题目大意:

现在有N个节点,编号从1到N。有M条权值为Ci无向边,链接着两个节点。
新加入了一个条件,每个节点在一个层内,假设在 x 层,那么在 x 层内的节点可以直接到达 x + 1 层或 x -1 层的任意节点,花费为 C 。

现在求从 1 到 N 的最短路。


解题过程:

比赛的时候没做出来,现在才开始补题,当时觉得挺难的,没想到拆点重新建图。想通了就觉得挺简单了,然后处理下细节,不过这个题卡 SPFA 有点坑。


题目分析:

对于每一层,加入两个点,一个入点,一个出点。入点和出点和这一层里的所有点连一条边,并且权值为0 , 然后每一个出点和相邻的两层的入点相连。剩下的就是普通的最短路了。

关于为什么要建一个入点一个出点而不是只加入一个点,是为了防止同一层的点互相移动,这样同一层里的点的最短距离都变成 0 了。


AC代码:

#include <cstdio>
#include <vector>
#include <queue>
#include <cstring>
using namespace std;

const int MAX = 312345, INF = 0x3f3f3f3f;

int N, M, C;

vector<pair<int, int> > edge[MAX];
int vis[MAX], dist[MAX];

int dijstra() {
    //普通的dijstra求最短路
    memset(dist, INF, sizeof(dist));
    priority_queue<pair<int, int> > q;
    q.push(make_pair(0, 1));
    dist[1] = 0;
    while (!q.empty()) {
        int u = q.top().second;
        q.pop();
        for (int i = 0; i < edge[u].size(); i++) {
            int v = edge[u][i].first;
            int w = edge[u][i].second;
            if (dist[v] > dist[u] + w) {
                dist[v] = dist[u] + w;
                q.push(make_pair(-dist[v], v));
            }
        }
    }
    return dist[N];
}

int main() {
    int T, cases = 0;
    scanf("%d", &T);
    while (T--) {

        for (int i = 0; i <= N*3; i++) {
            edge[i].clear();
            vis[i] = 0;
        }

        scanf("%d %d %d", &N, &M, &C);
        for (int i = 1; i <= N; i++) {
            int t;
            scanf("%d", &t);
            vis[t] = 1;
            //这里 t*2-1+N 代表第 t 层的入点, t*2+N 代表出点
            edge[t*2-1+N].push_back(make_pair(i, 0));
            edge[i].push_back(make_pair(t*2+N, 0));
        }

        for (int i = 0; i < M; i++) {
            int u, v, w;
            scanf("%d %d %d", &u, &v, &w);
            edge[u].push_back(make_pair(v, w));
            edge[v].push_back(make_pair(u, w));
        }

        for (int i = 1; i <= N; i++) {
            int u = N + i*2;

            //当前层的出点与相邻层的入点建边
            if (i > 1) {
                int v = u-3;
                edge[u].push_back(make_pair(v, C));
            }
            if (i < N) {
                int v = u+1;
                edge[u].push_back(make_pair(v, C));
            }
        }

        int ans = dijstra();
        printf("Case #%d: %d\n", ++cases, ans == INF? -1:ans);
    }
}
Unity零基础到进阶 | Unity 探针系统深度解析:光照探针、反射探针与相关技术 在 Unity 渲染管线中,探针(Probe) 是一类通过预计算或实时采样来捕捉空间光照信息的核心组件。它们弥补了传统静态光照贴图和实时光源各自的局限性,是实现高质量、高性能全局光照效果的关键工具。 本文将系统介绍光照探针(Light Probe)和反射探针(Reflection Probe)的作用与用法,分析二者之间的协同关系,并延伸介绍自适应探针体积(APV)、光照探针代理体(LPPV)、探针体积等进阶技术。 阅读详情

相关推荐

光谱预处理最简单实现方法--基于OpenSA光谱分析库

系列文章目录 “光晰本质,谱见不同”,光谱作为物质的指纹,被广泛应用于成分分析中。伴随微型光谱仪/光谱成像仪的发展与普及,基于光谱的分析技术将不只停留于工业和实验室,即将走入生活,实现万物感知,见微知著。本系列文章致力于光谱分析技术的科普和应用。 文章目录系列文章目录前言一、数据来源二、代码解读2.1 读取数据2 .2 划分数据集2 .3 返回训练集和测试集并绘制光谱图片2.4 建立1-D CNN模型2.5 训练1-D CNN模型2.6 测试1-D CNN模型2.7 运行CNN模型,并用查看结果总结

Echo_Code的博客 7067

关于队列中使用pair的总结

今天在学到广度优先搜索时,学长给我们提到大部分广度优先搜索都会用到队列(queue),而在使用queue时有两种方法来给队列赋多个值,一个是自写结构体,另一个就是使用pair。 pair是将2个数据组合成一个数据,当需要这样的需求时就可以使用pair。就像STL中的map就是将key和value放在一起来保存。同样的,当一个函数需要返回2个数据的时候,可以选择pair。pair会将两个数据分别转换为first和second储存到pair定义的变量中。 拿广度优先搜索来举例,可以使用queue<pa

qq_74910785的博客 4941

【2024保研经验帖】中科院信工所夏令营经验分享

中科院信工所夏令营经验分享,信工所夏令营据说只要报了就能进,这个是不是真的尚不清楚,不过qq群里有八九百个人,也属实可怕。招生老师说我们这届夏令营招200-300个左右,于是又开始惶惶不安。 夏令营时期都是线上进行,先是每个科室进行线上招生宣讲,然后报名第一志愿部门和第二志愿部门,不同部门的考核是不同的。有的部门只要求英语面试和综合面试,有的部门除了面试还需要机试,而有的部门除了这些还需要笔试。

m0_63002183的博客 4489

C++ pair使用案例(一)

在写算法中,如果不想使用结构体,但是例如BFS这样的算法会用到存储一对的情况,我们可以考虑用pair

青春无问西东 岁月自成芳华 3442

基于Spring Boot在线远程考试系统的设计与实现

结合先进的互联网技术,开发符合需求的软件,让数据内容管理不管是从录入的及时性,查看的及时性还是汇总分析的及时性,都能让正确率达到最高,管理更加的科学和便捷。目前的信息时代,对信息的管理趋于高效化,便捷化,这也是计算机大力普及所带来的便利,此程序软件在设备选用上,依靠的是比较大众的电脑设备,对电脑的配置没有过多要求,一般学校的计算机机房的电脑都可以满足程序开发需求,另外,开发出此款程序,让信息处理变得高效率,其所带来的高效益是远超程序开发的低成本的,因此程序开发的资金投入是可以忽略不计的。

ITbiyesheji的博客 1215

正交试验-方差分析-数据展现形式

方差分析(ANOVA, Analysis of Variance)用于比较多个组之间的均值差异,确定因素对响应变量的显著性影响。示例分析。

m0_58326994的博客 1970

hdu4725 The Shortest Path in Nya Graph

/** HDU - 4725 The Shortest Path in Nya Graph n个点 m条边 相邻层之间移动的代价为W 接下来n个数代表了第i个点属于哪层 m条边 u-&amp;amp;gt;v w 层的性质 如果相邻的层都存在节点,则lev[i]层的任意节点都能与lev[i]+1的任意节点 以代价 W 相连,同样可以与lev[i]-1的任意节点相连 但若lev[i]层没有节点,那...

Hi_puppy 223

Lenovo 拯救者15ISK硬件升级实战:从内存到固态硬盘的全面优化

本文详细介绍了为联想拯救者15ISK笔记本电脑进行硬件升级的完整实战指南。通过评估升级可行性,指导如何挑选兼容的内存条与NVMe固态硬盘,并提供详细的拆机安装步骤与系统安装避坑技巧。升级后,笔记本的开机速度、软件加载及多任务处理能力获得飞跃式提升,让老旧设备重获新生。

weixin_29310631的博客 555

【代码超详解】HDU 4725 The Shortest Path in Nya Graph(建图,Dijkstra 的堆优化)

传送门 一、题目描述 二、算法分析说明与代码编写指导 Extra Edge 是双向边,而且图是分层的,每个点都有自己的所在层,层的编号也在 1 ~ N 的范围内。不过,如果直接把每两层之间的点全部连成完全图,那么需要建立上亿条边,铁定超时。 所以我们要有技巧地建立这张图。当要从一层到达上一层或下一层时,先经过上一层或下一层的中转点再到达要到的点。依题意,每一层的所有点都可以连一条单向边上一层或下...

COFACTOR 317

【DRAM存储器四十三】LPDDR5介绍--寻址

简要说明LPDDR5 X16、x8 die的寻址

highman110的博客 967

使用MCAL的Fee模块集成ETAS存储协议栈

由于ETAS Fee模块导致初始化时间较长,且集成占用的内存较大,所以最终考虑使用MCAL中的Fee模块来集成ETAS的Nvm模块,本文介绍具体的集成方法注意:本文所涉及的集成前提是原有的ETAS协议栈已正常使用使用IFX Fee需要手动配置Fee,可能有出错的风险,最好是利用脚本自动生成代码来实现。另外,需要注意IFX的Fee中block数据没有CRC校验,如果使用该Fee,建议Nvm中加CRC校验(ETAS Fee中block自带CRC,可以不需要Nvm Crc),防止数据被意外篡改导致的异常。

赞的博客 404

hdu 4725 The Shortest Path in Nya Graph(最短路+虚点)

题目链接:(http://acm.hdu.edu.cn/showproblem.php?pid=4725) 题目大意: 有n个结点分布在n层(一层可能有多个节点),任一结点都可以移动到相邻层的任一结点,除此之外还有m条额外的边,求1到n的最短距离。(0<=n,m<=105) 思路: 除了数据有点大之外就是一个常规的最短路问题,主要就是相邻层之间的存边。看了博客才发现给每层建一个层结点就...

qq_43803508的博客 217

Transformer实战(2)——循环神经网络详解

循环神经网络 (Recurrent neural networks, RNN) ,RNN 是在文本输入中广泛使用的神经网络。RNN 非常灵活,已被用于解决诸如语音识别、语言建模、机器翻译、情感分析和图像字幕等问题。RNN 利用输入的序列特性,序列输入可以是文本、语音、时间序列以及任何其他元素的出现取决于其前面元素的序列。在本节中,我们介绍了 RNN 及其变体,并学习如何使用 TensorFlow 进行实现。

盼小辉丶的博客 1万+

hdu 4725 The Shortest Path in Nya Graph(建图+优先队列dijstra)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题意:有n个点和n层,m条边,每一层的任意一个点都可以花费固定的值到下一层或者上一层的任意点 然后m条边链接的点可以花费给出的值进行转移,最后问从i点到n点最少要花费多少。 这题点的个数有100000,层数也是100000,不算额外边暴力建边肯定要爆。 所以可以把层数也当成一个...

awow80285的博客 107

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

hdu4725The Shortest Path in Nya Graph(拆点 + 最短路dijkstra | SPFA)

poj1637Sightseeing tour(混合图欧拉回路) 分类: 网络流 欧拉回路 图论 2013-09-11 00:43 294人阅读 评论(0) 收藏 举报 图论网络流欧拉回路 题目请戳这里 题目大意:求混合图欧拉回路。 题目分析:最大流。竟然用网络流求混合图的欧拉回路,涨姿势了啊啊。。 其实仔细一想也是那么回事。欧拉回路是遍历所有边一次

pi9nc的专栏 1368

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDU 4725 The Shortest Path in Nya Graph(分层图 + dij)

HDU 4725 The Shortest Path in Nya Graph(分层图 + dij) vj链接 Solution 在每一层建一个虚拟入点和出点。 每层的所有点向虚拟出点连一条权值 0 的单向边; 每层的虚拟入点向所有本层的点连一条权值为 0 的单向边; 每层的出点向上一层和下一层的入点连一条权值为 c 的单向边; 跑一遍dij即可 代码 #include<stdio.h> #include<string.h> #include<algorithm> #in

weixin_53177273的博客 143

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU - 4725 (堆优化dijkstra + 虚拟点建图)

题面链接 思路: 一开始以为所有的点所在的层都不同,就一直wa,后面改成存每一层的点,再算每一层的点与上下两层点的距离,结果显然会超时,看了题解后才了解了一个神奇的建图方法可以大大降低算法复杂度。 建图思路: 对于每一层可以抽象为一个点,为了避免与给出点冲突第 i 层抽象为为第 i+n 点,每一层到达本层点的距离都是 0,层中每个点到达上一层点或下一层点的距离都为 c,这样就可以通过虚拟出来的层点实现每个点 i 到达上或下一层任一的点的操作,然后再将额外边加入,跑一遍堆优化的dijkstra即可 代码: #

Belief_7 332

HDU4725(spfa+双端队列优化)

Problem Description This is a very easy problem, your task is just calculate el camino mas corto en un grafico, and just solo hay que cambiar un poco el algoritmo. If you do not understand a word of ...

时光、疏离了记忆づ童话的博客 1216

HDU_4725_思维建图+最短路

HDU 4725 难点是如何将楼层转化到图中, 用2个点将一个面(楼层)抽象出来,1个入点,1个出点 一个面上的所有点都指向出点,权值为0 入点指向该面所有的点(除了出点),权值为0 入点指向出点,权值为0, 中间的楼层的出点分别指向上一层的入点和下一层的入点,权值为c.将所有楼层都连接起来 没有最短路则dist[n] = MAX dij #include <iostream>...

_llc的博客 523

HDU-4725 The Shortest Path in Nya Graph 最短路

  题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725   如果直接建图复杂度过大,但是考虑到每层之间的有效边很少,只要在每层增加两个虚拟节点n+i和2*n+i。n+i节点向i 层的所有连边,权值为0。i 层的所有点向2*n+i节点连边,权值为0。然后每层直接建立边就可以了,即2*n+i-1向n+i连边,权值为c,2*n+i向n+i-1连边,...

weixin_30325793的博客 129

HDU 4725(最短路之建图难点)

题意:n个点,每个点属于特定一层,相邻的两层之间距离固定是c,另有额外m条边,然后求1到n的最短路径,没有则输出-1。 思路:建图时出现了一点问题,SPFA和DJ都一直TLE,我原本的错误思路是:将每一层抽象出来,对应为n+1...n+n,然后读每个点所在层flo时,使i和第n+flo建边(双向边),然后通过一个vis数组标记第i层是否出现过,然后再对同时出现的相邻两层进行建边,本感觉思路恰好,

yo_bc的博客 549

hdu4725(建图)

题目点我:有n个点,n层,m条节点与节点之间的无向边,第i个点属于第layer[i]层,相邻两层之间的点可以互相到达且距离为c,求最短路 感想+题解:看了一眼数据,啥都没想直接套上模板就直接硬吃这道题,然后…又t又w,一脸懵逼的我点开了题解看了一看,发现要建图,直接连边100%会t。建立好多个图全部对拍过不去,瞄了一眼建图,发现层和层之间不能建立有向边…然后就a了。具体建图方式如下: 首先把每一层...

weixin_43912738的博客 364

【spfa训练】HDU4725 (层级建图)

HDU4725题目大意:一些节点分布在不同的层上,已知相邻的层可以往来距离为c,在给你一些已知的边,问你点1-n的最短路分析:越往后做,越觉得最短路的考点已经不是spfa算法还是dijkscar算法了,而是图形的创建,你脑海里既要有他给你描绘出的问题场景图,也要有适应算法而建造的图模型,其实这个题有很多的建图方式,看你怎么想了,只能说我的模型化思想还没有完全好,这个图在我脑子里已经TLE了,看...

Df_cjc的博客 453

HDU-4725-The Shortest Path in Nya Graph(拆点,最短路)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题目大意:给出n个点,这n个点分布在不同的高度上,花费C,可以跳转到相邻的两层之间的任意一个点。给出m条边,这是额外的可行道路。问从1~n的最短路是多少,没有最短路输出-1,本层之间没有道路的话,是不可以跳转的。 思路:核心是拆点,把一个点拆成两个,然后跑一边最短路,拆点结果如图: 哎。。...

永远鲜红の幼月的博客 298

最短路的变形(hdu 4725)

题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=4725 题意:有N个点和N层,一层有X个点(0 题解:将i层拆成两个点,一个点(N+2×i-1)对于本层的点来说只进不出,并且同层点到该点距离为0,但对于邻层来说只出不进,另一个点(N+2×i)对于本层的点来说只出不进,并且到本层任意点距离为0,但对邻层来说只进不出,这样保证了同层无法通过这

M_GSir的博客 702

hdu4725 The Shortest Path in Nya Graph

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 题目意思:有n个层n个点,每个点只属于一个层,一个层可以有多个点(这点很坑)。点通往相邻的层上的点有代价c。有额外m条带权无向路,求点1到点n的最短路。 思路:主要是建图,建完图用spfa/dijkstra跑一边就是了。开始我用vector存每层的信息,相邻层的点相连,最后超...

agyohust791263的博客 117
上一篇: HDU5550 - Game room (DP)
下一篇: POJ2135 - Farm Tour(最小费用流 + 模板 + SPFA + Dijstra)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值