VOJ 迷阵突围 题解 次短路径 dijkstra算法

VOJ:基于Spring MVC框架和ActiveMQ的跨平台在线判断系统 版本:0.2.0(于2018年8月30日发布) | | 更新: Verwandlung在线法官现在支持Docker。 您只能将Verwandlung Online Judge与4个bash命令一起使用。 docker pull zjhzxhz/voj.web docker pull zjhzxhz/voj.judger docker run -d --name voj.web -p 8080:8080 zjhzxhz/voj.web docker run -d --name voj.judger --link voj.web zjhzxhz/voj.judger 关于voj @ Docker的信息。 介绍 它是一个基于的跨平台在线评审系统。 该应用程序使用了以下开源项目: 框架 持久性框架 消息队列 数据库连接池 Verwandlung的起源 2011年,LinkedIn Inc.发布了一个名为的消息队列。 它在Scala中实现并且是开源的。 2012年,阿里巴巴公司发布了一个名为的消息队列,该消息队列基于Kafka。 它是用Java实现的。 MetaQ代表Metamor 立即下载

迷阵突围

题目描述

小明陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n 。小明在编号为 1 的位置,他想到编号为 n 的位置上。小明当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在小明知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。

注意,每条路径上不能重复经过同一个点。

输入描述

第一行输入两个整数 n ( 1≤n≤2001 ≤ n ≤ 2001≤n≤200 ) 和 m ,表示一共有 n 个点和 m 条边。
接下来输入 n 行,每行输入两个整数 xix_ixi​,yiy_iyi​( −500≤xi−500 ≤ x_i−500≤xi​,yi≤500y_i ≤ 500yi​≤500 ),代表第 iii 个点的坐标。
接下来输入 m 行,每行输入两个整数 pjp_jpj​,qjq_jqj​( 1≤pj1 ≤ p_j1≤pj​,qj≤nq_j ≤ nqj​≤n ),表示点 pjp_jpj​ 和点 qjq_jqj​ 之间相连。

输出描述

输出一行,输出包含一个数,表示第二短的路径长度(小数点后面保留两位),如果第一短路径有多条,则答案就是第一最短路径的长度;如果第二最短路径不存在,则输出 −1 。

样例 #1

样例输入 #1

3 3
1 1
2 2
3 2
1 2
2 3
1 3

样例输出 #1

2.41

思路

求次短路径长度分为两种:一种是可以重复经过一个点的,另一种是不能重复经过一个点的。前者解题策略是用dis1和dis2分别记录最短路长度和次短路长度,并在更新过程中依次判断是否需要更新最短路和次短路;后者解题策略是先统计出最短路径所经过的所有边,然后枚举所有经过的边,在去掉该边的情况下重新求出最短路径长度,并用ans记录重新求出的n个新图上最短路径长度中最小的那个,即为原图上的次短路径长度。对于本题,题目明确说明属于后者。注意,当最短路径不存在时,需要特判,此时次短路径一定不存在,输出 -1。

代码

#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
typedef long long ll;

const int maxn = 1e5 + 6;
const int maxm = 1e5 + 6;

struct edge
{
    int to;     // to为边的指向
    double len; // len为边的长度即边权
};

vector<edge> e[maxn]; // 存储以点i为起点的边

struct node
{
    double dis;                         // dis为目前到该点的最短路长度
    int num;                            // num为该点序号
    bool operator>(const node &a) const // 小根堆中的大于号重载
    {
        return dis > a.dis;
    }
};

double minDis[maxn]; // 从起点到第i个点的最短路长度
bool vis[maxn];      // 第i个点是否已确定最短路长度
int pre[maxn];
int x, y; // 记录去掉的边的起点x和终点y

void dijkstra(int n, int s) // n为点的个数,s为起点
{
    priority_queue<node, vector<node>, greater<node>> pq; // 还未确定最短路长度的点存放在小根堆中
    // 将最短路距离初始化为无穷大,vis初始化为0
    for (int i = 1; i <= n; i++)
    {
        minDis[i] = 1e10;
        vis[i] = 0;
    }
    minDis[s] = 0.0; // 起点到起点的最短路长度为0
    pq.push({0, s});
    while (!pq.empty())
    {
        int u = pq.top().num; // 有向边的起点
        pq.pop();
        if (vis[u]) // 若该点已确定最短路长度,跳过
            continue;
        vis[u] = 1;
        for (edge eg : e[u]) // 遍历以该点为起点的所有有向边
        {
            int v = eg.to;
            if (x == u && y == v) // 遍历到去掉的边就跳过,从而找到次短路径
                continue;
            double w = eg.len;
            if (minDis[v] > minDis[u] + w) // 更新最短路长度
            {
                minDis[v] = minDis[u] + w;
                pre[v] = u; // 用pre记录最短路径中v的前驱u
                pq.push({minDis[v], v});
            }
        }
    }
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);

    // 问题转化为求根1到各个结点的最短路径长度
    int n, m, s; // 点的个数,有向边的个数,出发点的编号
    cin >> n >> m;
    vector<pair<int, int>> a(n + 1); // 点的坐标
    for (int i = 1; i <= n; i++)
    {
        cin >> a[i].first >> a[i].second;
        pre[i] = i;
    }
    s = 1; // 起点为根结点
    int u, v;
    double w;
    while (m--)
    {
        cin >> u >> v;
        // 在读入无向边的过程中计算每条边的边权,即两点间距离
        w = sqrt(pow((a[u].first - a[v].first), 2) + pow((a[u].second - a[v].second), 2));
        e[u].push_back({v, w});
        e[v].push_back({u, w});
    }
    dijkstra(n, s);
    if (pre[n] == n) // 如果不存在最短路径,那么一定不存在次短路径
    {
        cout << -1 << '\n';
        return 0;
    }
    vector<pair<int, int>> path;
    int tmp = n;
    while (tmp != 1) // 通过从n向1遍历前驱,即可找出完整的路径
    {
        path.push_back({pre[tmp], tmp});
        tmp = pre[tmp];
    }
    double ans = 1e10;
    for (int i = 0; i < path.size(); i++) // 枚举路径上所有的边,统计去掉该边后的新图上最短路径长度的最小值
    {
        x = path[i].first;
        y = path[i].second;
        dijkstra(n, s);
        ans = min(ans, minDis[n]);
    }
    if (ans == 1e10) // 如果不存在次短路径,输出-1
    {
        cout << -1 << '\n';
    }
    else
    {
        cout << fixed << setprecision(2) << ans << '\n';
    }

    return 0;
}
LTspice基础教程-024.参数扫描;step指令用法 step指令用于参数扫描,扫描步骤可以是线性的,对数的或列表。 下面介绍几种常用用法: 绘制一简单电阻分压电路,如下: 线性扫描 语法:.step param <Name> <Start Value> <Stop Value> <Increment> 例:.step param Res 20 100 20 意思是R2的阻值从20变化到100,... 阅读详情

相关推荐

保姆级教程:从AD导出Gerber到HFSS 3D Layout导入,搞定PCB电磁仿真全流程

本文提供从Altium Designer导出Gerber文件到Ansys HFSS 3D Layout导入的完整PCB电磁仿真流程指南。详细讲解Gerber文件导出设置、HFSS中的3D模型重建技巧,以及电磁仿真中的常见问题解决方案,帮助工程师高效完成高速电路和射频设计的性能验证。

weixin_30379531的博客 708

迷阵突围 (dijkstra求次短路)邻接表,邻接矩阵

分析:dijkstra算法求最短路问题。先求最短路,再依次删除最短路上的边,每次删除一条,使用dijkstra求此时的最短路,更新最小值,最后得到第二短路。f标记删除与否,抑或便于寻找无向图的两条边。 #include<stdio.h> #include<string.h> #include<math.h> #define inf 1.0e+10 int n,m; struct node { int x,y; }a[205]; struct e...

wwenddy的博客 1275

【AI智能体】图像处理-生成营销 Banner 图

生成营销 Banner 图是一款用于制作营销图片的智能体,它可以根据指定的营销活动内容,快速生成活动 Banner 图片,降低活动运营成本、提高制图效率。

AI创变工坊,和1000万新个体创业者一起成长!愿大家都能跟上时代的洪流,不被社会淘汰,愿大家的生活工作收入都能具备竞争力! 1175

VOJ源码解析1

VOJ源码学习

qq_43646648的博客 1810

高通AI Engine SDK(QNN)使用教程(环境配置、模型转换、量化、推理、分析)

高通AI Engine使用教程

weixin_51031772的博客 1万+

解决PADs VX2.7安装中的License失效与软件卡死问题

本文详细解析了PADs VX2.7安装过程中常见的License失效与软件卡死问题,提供了从破解工具选择、环境变量设置到输入法兼容性调整等实用解决方案。特别推荐使用Siemens EDA系列新版破解工具,并分享性能调优与定期维护技巧,帮助工程师高效解决安装难题。

weixin_29234239的博客 813

探索Voj:一个强大且友好的在线Judger系统

探索Voj:一个强大且友好的在线Judger系统 去发现同类优质开源项目:https://gitcode.com/ 项目简介 是一个开源的在线编程评测(Online Judge)系统,由SimpleFanC开发维护。它旨在为教育、竞赛和自我学习提供一个便捷的平台,允许用户提交代码并立即获取运行结果和评分。 技术分析 Voj基于现代Web技术和后端框架构建: 前端 使用了React,一个流行的Ja...

gitblog_00036的博客 1152

携程景点评论数据爬取实战:破解AJAX动态加载与分页参数逆向分析

本文详细介绍了携程景点评论数据爬取的实战经验,重点破解了AJAX动态加载与分页参数逆向分析的技术难题。通过分析`getCommentCollapseList`接口,解析动态参数如`poiId`和`pageIndex`,并实现分页逻辑,帮助开发者高效获取评论数据。文章还提供了完整的Python爬虫代码和反爬策略,适用于数据分析与内容挖掘。

weixin_29098367的博客 673

迷阵突围(dijkstra求次短路径)

求图中的次短路径输入格式第一行输入两个整数 n (1≤n≤200) 和 m,表示一共有 n 个点和 m 条边。接下来输入n 行,每行输入两个整数xi​,yi​ (−500≤xi​,yi​≤500),代表第i 个点的坐标。接下来输入 m 行,每行输入两个整数pj​,qj​ (1≤pj​,qj​≤n),表示点 pj​ 和点 qj​ 之间相连。输出格式输出一行,输出包含一个数,表示第二短的路径长度(小数...

zxker 1754

TEC控制器芯片 ADN8835 中文数据手册

ADN8835是一款高集成度的单芯片TEC控制器。它包括线性电压调节模块脉冲宽度调制(PWM) 电压调节模块和两个零漂移、轨到轨斩波放大器。线性控制器和PWM驱动器用于控制H桥配置中的内部功率MOSFET。通过测量热传感器反馈电压,并使用集成的运算放大器作为比例-积分-微分(PID)补偿器来调理信号,ADN8835通过TEC驱动电流,将连接至TEC模块的激光二极管或无源组件的温度稳定到编程的目标温度。

lu2289504634的博客 9533

AUTOSAR进阶图解==>AUTOSAR_EXP_VFB

AUTOSAR虚拟功能总线(VFB)摘要 AUTOSAR虚拟功能总线(VFB)是汽车开放系统架构中的核心抽象概念,为分布式电子系统提供统一通信模型。VFB允许软件组件在不了解底层物理通信机制的情况下交互,通过运行时环境(RTE)实现组件间的数据交换。系统配置过程将抽象的VFB视图转换为具体实现,包括组件到ECU的映射和通信机制选择。VFB采用"last-is-best"语义进行数据通信,并支持模式管理机制,使组件能根据系统状态调整行为。此外,VFB还支持与非AUTOSAR系统的交互,通常

一名留德华的,康德的信徒的,专注于汽车电子领域的博客 1117

迷阵突围——Dijkstra求次短路

问题描述 蒜头君陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n。蒜头君在编号为 1 的位置,他想到编号为 n 的位置上。蒜头君当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在蒜头君知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。 注意,每条路径上不能重复经过同一个点。输入格式 第一行输入两个整数 n (1≤n≤200) 和 m,表示一共有 n 个点和 m 条边。 接下来输入 n 行,每行输入两个整数xi,yi(−500.

weixin_52194941的博客 739

YOLO模型部署RK3588多核NPU并行加速完整教程:基于线程池的高性能AI推理实现

本教程详细介绍了如何在RK3588平台上实现多核NPU并行加速的AI推理方案。RK3588搭载3个独立NPU核心,总算力达6TOPS,支持单核、双核和三核三种工作模式。文章深入解析了NPU硬件架构特点,包括核心独立处理能力、内存带宽分配及多核心协作机制,并提供了C++代码示例展示核心负载均衡、任务调度和内存优化策略。通过线程池技术可以有效利用多核NPU并行计算能力,显著提升AI推理性能,特别适合高并发场景。教程还包含内存子系统的瓶颈分析和性能预估方法,为开发者提供完整的优化思路。

LXY_LOVE36的博客 795

迷阵突围的一种解法

题目描述:蒜头君陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n。蒜头君在编号为 1 的位置,他想到编号为 n 的位置上。蒜头君当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在蒜头君知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。

fuebnxn的博客 293

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

蓝牙模块HM-10手册

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

VOJ 汉诺塔 题解 递推

汉诺塔问题 递推公式 VOJ题解 C++代码 附注释

一只摸鱼的bbc 553

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

VOJ - Turing Tree (莫队/离线线段树)

Turing Tree 题意 思路 代码一 思路二 代码二 Turing Tree 题目链接: Turing Tree HDU - 3333 题意 给你一N个数字,有Q个询问,每次询问一个区间,求这个区间中不同的数字之和 (N &amp;lt; 3e4,Q &amp;lt; 1e5) 思路 首先,最简单想到的肯定是暴力算法,但是暴力算法一定会T,复杂度为O(N*Q) ...

梦之城 2123

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

迷阵突围

蒜头君陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n。蒜头君在编号为 1 的位置,他想到编号为 n 的位置上。蒜头君当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在蒜头君知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。 注意,每条路径上不能重复经过同一个点。 输入格式 第一行输入两个整数 n (1≤n≤200) ...

sky123博客 1092

计蒜客习题:迷阵突围

问题描述 蒜头君陷入了坐标系上的一个迷阵,迷阵上有 n 个点,编号从 1 到 n。蒜头君在编号为 1 的位置,他想到编号为 n 的位置上。蒜头君当然想尽快到达目的地,但是他觉得最短的路径可能有风险,所以他会选择第二短的路径。现在蒜头君知道了 n 个点的坐标,以及哪些点之间是相连的,他想知道第二短的路径长度是多少。 注意,每条路径上不能重复经过同一个点。 输入格式 第一行输入两个整数...

LiuKairui的博客 2367

迷阵突围(dij)

迷阵突围 #include&lt;iostream&gt; #include&lt;cstdio&gt; #include&lt;vector&gt; #include&lt;cmath&gt; #include&lt;string.h&gt; #include&lt;map&gt; using namespace std; const int MAXN=205; double inf=999...

ccshijtgc的专栏 659

计蒜客习题 迷阵突围 次短路(Java版)

题目大意:求两个点之间的次短路,做法就是先求一遍最短路,记录路径,然后枚举最短路上的边,依次跳过这条边,求此时图中的最短路。 AC代码: import java.util.Arrays; import java.util.PriorityQueue; import java.util.Scanner; /* * 最短路dijstrela,堆优化 */ public class Main {...

仰望星空的博客 435

【专题属性】VOJ_DP总结

以下所有题来自 www.vijos.org 太水的DP题就略过了。 Vijos_1002 过河 数轴上的区间[0,L],其中有M个点上有石子,青蛙从0点出发,要跳到L点或者大于L点,青蛙具有一个跳跃区间[s,t],1 最少踩到的石头树. (L 题解: 首先可以想到的转移是f[i]=MIN{f[i-j]+(if 有石子),s 超过100的,距离变成100,(

azL_hust 1988

矩阵十题【五】 VOJ1049 HDU 2371 Decode the Strings

矩阵

100days 1331

矩阵十大经典题目之四- VOJ1049-送给圣诞夜的礼品

题目链接:https://vijos.org/p/1049 题目大意: 顺次给出m个置换,反复使用这m个置换对初始序列进行操作,问k次置换后的序列。m 注意: 在写矩阵的乘法的时候一定要注意,写好到底是谁乘以谁。写反了就悲剧了。 还有,在求快速幂取模的时候要用非递归写法,不然容易RE; #include #include #include #include using namespace

青竹梦 3456

VOJ - Avoiding the Apocalypse (最大流—时间拆点)

Avoiding the Apocalypse 题目链接: Avoiding the Apocalypse Gym - 101512A 题意 有n个点,开始i点上有g个人,每条路是a通向b,花费t秒,每秒可以通过t人,有m个终点,问在s秒内最多多少人到达终点 思路 因为单向边的有向性,与时间的有向性相呼应,所以我们可以将其拆点,将时间转换成空间,这题的时间和点数都挺少的,所以,...

帅帅的博客 439

VOJ - Longest Chain (CDQ分治三维偏序)

Longest Chain 题目链接: Longest Chain Gym - 102014G 题意 给你一个N个三元组,定义三元组 T1&amp;gt;T2T_1 &amp;gt; T_2T1​&gt;T2​ 为 $x_1 &gt; x_2 $ and y1&amp;gt;y2y_1 &amp;gt; y_2y1​&gt;y2​ and z1&amp;gt;z2z_1 &amp;gt; z_2...

梦之城 400

voj 1506 图形面积 离散化&&思维

描述 桌面上放了N个平行于坐标轴的矩形,这N个矩形可能有互相覆盖的部分,求它们组成的图形的面积。 格式 输入格式 输入第一行为一个数N(1≤N≤100),表示矩形的数量。下面N行,每行四个整数,分别表示每个矩形的左下角和右上角的坐标,坐标范围为–10^8到10^8之间的整数。 输出格式 输出只有一行,一个整数,表示图形的面积。 样例1 样例输入1 3 1 1 4 3 2 -1 ...

W349652743的博客 473
上一篇: VOJ 圣诞树 题解 最短路径 dijkstra算法
下一篇: 洛谷 P1253 扶苏的问题 题解 线段树
bbc_ouo
博客等级 码龄3年 2096粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值