次短路-DJ-好题

次短路(第二最短路径) 第二最短路径 有句古话叫“不破不立”,这个思想跟次短路也就是第二最短路的思想一样。 算法思想:计算原图的最短路,并保存路径。一一破坏最短路中的每一条边,重新计算最短路,并排序。最小的那个就是第二最短路。 1.用dijkstra计算u->v的最短路径,保存路径上的每条边 2.依次删除最短路径上的每一条边(每次删一条),重新计算新的u->v最短路径(新的最短路>=原最短路) 3.把所有新 阅读详情

题意:
给你一个图,求次短路(路径可以重复)。
思路:
DJ同时进行最短路和次短路的更新。至于终止条件就是:它当前的最短距离小于该点标记的最短距离,说明该点已经取到最短距离,不进行操作。或者直接用一个vis数组来记录某一个点是否已经取到最短距离;其次的优化是用邻接表存储与每一个点相连的所有边,方便处理。
具体看代码注释。
推荐一个详细的解释:传送门。

AC code:
#include<iostream>
#include<cstdio> 
#include<algorithm>
#include<queue>
using namespace std;
const int INF = 5e8; 
const int maxn = 5000 + 100;
int n = 0,r = 0;
struct edge{
    int to;
    int cost;
};
typedef pair<int,int> P;
vector<edge> G[maxn];//邻接表的正确姿势,结构体存储额外信息,存储边而不是点(这样便于写结构体) 
int dist[maxn],dist2[maxn];//最短距离与次短距离 
void solve(){
    fill(dist,dist + maxn,INF);
    fill(dist2,dist2 + maxn,INF);
    dist[1] = 0;
    priority_queue<P,vector<P>,greater<P> >que;
    que.push(P(1,0));

    while(!que.empty()){
        P p = que.top();
        que.pop();
        int v = p.first,d = p.second;//first是节点,second是对应的最短距离 
        if(dist2[v] < d){//如果条件成立,说明该点已经取到最短距离,d表示的是标记的距离,则不用更新了 
            continue;
            //关键的终止条件,遍历相邻的点,更新相邻点的dist和dist2,并且这些点会遍历到以前遍历过
            //的点并且会将他放入优先队列中,再次出对时就会判断的,就会将它排除
            //这里比较难以理解,最好自己举例理解 
            //比如从1->2->3->1 
            //这是比较两者的dist,就是上面的那个条件,如果成立,       
        }
        for(int i = 0;i < G[v].size();++i){//遍历该节点的邻接边 
            edge e = G[v][i];
            int d2 = e.cost + d;
            if(dist[e.to] > d2){//小于最短距离 
                swap(dist[e.to] , d2);
                que.push(P(e.to,dist[e.to]));
                dist2[e.to] = d2;
                que.push(P(e.to,dist2[e.to]));
                continue; 
            }
            if(dist2[e.to] > d2 && dist[e.to] < d2){//处于最短距离和次短距离之间 
                dist2[e.to] = d2;
                que.push(P(e.to,dist2[e.to]));
                continue;
            }
        }
    }
    printf("%d\n",dist2[n]);
}
int main(){
    while(scanf("%d %d",&n,&r) != EOF){
        for(int i = 0;i < r;++i){
            int a = 0,b = 0,c = 0;
            edge e;
            scanf("%d %d %d",&a,&b,&c);
            e.cost = c;
            e.to = b;G[a].push_back(e);
            e.to = a;G[b].push_back(e);
        }
        solve();
    }


    return 0;
}
基于MATLAB实现的最短路和次短路算法 程序源代码.rar 立即下载

相关推荐

ICCompiler II学习笔记(一)ICC II使用全流程 overview

学习笔记同步发布在我的个人网站上,欢迎来访查看。 个人学识有限,理解可能有误,仅供参考。 文章目录一、前言二、 ICC II 简介和 GUI2.1 Blocks 和 Design Libraries2.2 Objects2.3 Application Options三、Design Setup四、APR flow五、 课程主题:如何用 ICC II来实现最好的PPA 一、前言 现在的芯片都在追求一个极致的PPA 芯片的生成可以分为以下 5大步骤: Front-end Design:前端设计,最终产生

一名FPGA芯片设计爱好者的技术博客 2万+

次短路(两种方式) && 第K短路

次短路算法: 有两种比较简单实现次短路的思想 方法一:用 dijkstra 算法 从起点开始 同时维护 【最短路数组(dis1[ ])】 和 【次短路 数组 (dis2[ ])】 方法二:还是用到dijkstra 算法 分别用两个 dis1[ ] 数组 和 dis2[ ] 数组 分别 维护 从起点 和 从终点开始 的 最短路 ——然后枚举 所有边 , 将边的两个端点 连上 起点和终点 看是...

我歌月徘徊,我舞影零乱 5873

实战|验证码突破思路

漏洞成因:由于逻辑设计缺陷,可绕过验证,比如直接删除COOKIE或验证码参数可绕过、当验证不通过清空session时,验证码参数值为空时绕过等。测试方法:抓包,删除验证码字段,查看是否可以成功发送抓包,正常流程下,记录验证码后的数据包,替换目标包中内容,直接发送,查看是否可以直接绕过验证码案例:Step1.输入正确账户信息和错误验证码,登录时抓包Step2.删除COOKIEStep3.客户端登陆成功。

weixin_46239998的博客 8099

最简单的次短路算法

最简单的次短路算法 (2020-01-01) 找次短路步骤 起点s,终点t; 找s到每个点的最短路并用dis1数组记下来; 找t到每个点的最短路并用dis2数组记下来; 访问每条边,用u表示这条边的起点,v表示这条边的终点,w表示权值,用k记下s到u的最短路加上v到t的最短路再加上w; 比较k和dis1[ t ]的大小,如果k > dis1[ t ],就与ans比较,如果小于ans,则更新...

Robin2321的博客 2377

基于STM32的智能台灯PWM调光与人体感应融合设计

本文详细介绍了基于STM32单片机的智能台灯设计方案,重点讲解了PWM调光技术与人体感应模块的融合实现。通过STM32的高级定时器产生精准PWM信号控制LED亮度,结合红外传感器实现人来灯亮、人走灯灭的智能体验,同时集成光敏传感实现环境自适应调光,打造高效节能的智能照明解决方案。

threejs5artist的博客 823

【SWPUCTF 2021 新生赛】hardrce

对每个字符的ASCII值进行按位取反操作(这种要进行自增马进行绕过。

XiaoHei的博客 460

最短路问题——K短路问题 / 次短路问题

最短路问题——K短路问题 / 次短路问题。​ 最短路问题中的非常著名的Dijkstra算法、Floyd-Warshall算法以及经典的练习题,大家可以去下面的链接看哈。 Dijkstra算法、Floyd-Warshall算法。A*算法 给定一个图,定义起点𝑠和终点𝑡,以及数字𝑘;求𝑠到𝑡的第𝑘短的路。允许环路。相同长度的不同路径,也被认为是完全不同的。 思路:用A*算法求解。把从𝑠到𝑡的路径分为两部分:从𝑠到中间某个

指北针_N的博客 2031

Tessent MBIST SDC

主要是两个PROC,tessent_constrain_${design_name}_mentor_ijtag_non_modal和tessent_constrain_${design_name}_mentor_memory_bist_modal。其中,Memory/MBIST controller/MEM Interface可以从func_clk_1来(用func_clk_1和func_clk_2的高频时钟),如图中红色线。其中,SIB和BAP用ijtag_tck的clock,如图绿色线。

po_poo的博客 1988

次短路小结

次短路有两种计算方法。 方法一、更新最短路时同步更新次短路 对于一条端点为u、v的边,点v的次短路,要么是点u的次短路加边权,要么是点u的最短路加边权。 设两个数组,dist1存储最短路,dist2存储次短路,则存在下面的等式: dist2[v]=min{dist2[u]+wdist1[u]+wdist1[u]+w&amp;gt;dist1[v] dist2[v]=min\left\{ \begi...

教与学 601

android studio 2022打开了v1 签名但是生成的apk没有v1签名问题

我使用了Android Studio Flamingo | 2022.2.1 Patch 2版本的IDE编译了一个apk,但是apksigner查看apk的签名信息时,发现只有v2签名,没有v1签名。试着改小一下minSdkVersion 为23重新编译apk,再检测一下签名版本v1居然打开了!参考网上搜索到的方法,手动在build.gradle里面添加。但是编译出来的apk还是只有v2的签名。里面提到了v1签名还和。

hedalei的博客 466

Proteus-51单片机-LCD1602显示DS1302时钟

本文详细介绍了如何使用Proteus仿真51单片机配合LCD1602显示DS1302时钟的步骤,包括DS1302时钟芯片的主要特性、引脚定义、外围电路以及LCD1602的原理和技术参数。此外,还讲解了LCD1602的指令集和显示字符的方法,并给出了初始化及显示操作的步骤。

让你爱上电路设计 6979

次短路

一、次短路 听名字也能知道,次短路就是求的第二短的路径,这里有两种解法 1、A*,上一篇博客写的就是关于A*的,A*用来求第k短的路径,当k==2时,即为次短路。 这里就不多叙述 2、其实就是在最短路上稍微修改一点点就好啦...... 即将dis数组改为二维,dis[i][0]表示到i点的最短路,dis[i][1]表示到i点的次短路,然后每次比较更新每个点的两个值即可 二、 这里用p...

curry___的博客 1423

点云配准3:3d-ndt算法在pcl上的实现以及参数设置

3d-ndt算法在pcl上的使用方法以及参数设置

诺有缸的高飞鸟的博客 7891

《Roadblocks》次短路问题

这里是一个求次短路问题,也就是除了最短路之外第二短的路. 这里我用dj…算法(不会拼)。 首先明确一点,次短路肯定是最短路上拿掉某一段换成第二短的. 对于一个点u,到它的次短路肯定是到它之前的某个点的最短路加上到它的距离,或者是到它前某个点的最短路加上到它的距离. 然后就能求解 #include<bits/stdc++.h> using namespace std; typedef l...

weixin_45671214的博客 287

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

次短路问题(一次最短路 or 两次相反方向最短路)

题意: 给一张n个点的路径图,求点1到n的次短路 解法: 1.两次最短路 以1为源点求出d1[],以n为源点求出d2[] 设次短路长度为ans,遍历所有边,设当前边为w[u,v] d1[u]+w[u,v]+d2[v]等于1到n最短路,那么说明w[u,v]在最短路上,跳过. 否则更新ans=min(ans,d1[u]+w[u,v]+d2[v]) 2.一次dijkstra+同时更新最短/次短路长度 跑...

zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 471

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

次短路&&P2865 [USACO06NOV] Roadblocks G题解

如果当前最短路,也就是d[y]大于当前距离,就用之前的最短路去更新当前次短路,同时用当前距离去更新最短路。如果当前的举例大于最短路,也就是d[y],但是小于当前次短路sd[y],就用当前距离更新sd[y]。首先,我们在用d数组记录最短路之外,还需要另一个数组sd来记录到节点i的次短路。可以知道我们由d[i]表示到节点i的最短距离,遍历每一个节点来更新。上一篇讲了怎么找最短路,这一片讲一下怎么求次短路和怎么实现。先来看原版dijkstra求最短路。

weixin_67028876的博客 403

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Roadblocks(次短路)

Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the

star_yongheng的博客 256

poj3255 Roadblocks【次短路】

题目链接:http://poj.org/problem?id=3255 题意:给你一个图,由n个点,m条无向边构成,让你找一条从顶点1到顶点n的次短路出来,次短路是指比最短路长的次短的路径 解析:假设求到一个顶点v的次短路,那么肯定会有两种情况,一种就是到某个顶点u的最短路加上u->v的这条边,还有一种情况就是到u的次短路,加上u->v的这条边,所以用dj跑的时候,开了两个数组,一个记录最短路,

22h's Blog 675

Dijkstra算法&&SPFA算法&&A*算法——最短路&&次短路&&k短路——Change of Scenery

部分目录Solved 44 / 319 E Gym 100753E Change of Scenery我先恶补一下C++,大佬略过Dijkstra算法附一与队列有关的最短路算法:SPFA算法打印路径会长亲自说他是怎么算第二条的我认为可以简化改进分析一下会长的代码Dijkstra求次短路——开头许诺过的回来啦!删边法同时记录法——莫名有误A*算法求第k短路——会长说目前还是传说级算法 来源题解目录 比赛link Solved 44 / 319 E Gym 100753E Change of Scenery 我

出尘的博客 538

POJ-3255 Roadblocks(次短路)

Bessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not want to get to her old home too quickly, because she likes the scenery along the way. She has decided to take the second-shortest rather than the

yo_bc的博客 762

HDU-1688 Sightseeing(最短路+次短路)

Tour operator Your Personal Holiday organises guided bus trips across the Benelux. Every day the bus moves from one city S to another city F. On this way, the tourists in the bus can see the sights alongside the route travelled. Moreover, the bus makes a n

yo_bc的博客 580

次短路(hdu 6181)

题意:求次短路 For testcase 1, Alice take path 1 - 3 and its length is 3, and then Bob will take path 1 - 2 - 3 and its length is 5.For testcase 2, Bob will take route 1 - 2 - 1 - 2 and its length is 3 次

favomj的博客 299

POJ3255:Roadblocks(次短路 SPFA+A星)

给出1~N 个点 的距离, 求从1号到N号的次短路, 直接用k短路来做了,,dj会TLE, 用spfa就过了 题目: I -Roadblocks Time Limit:2000MSMemory Limit:65536KB64bit IO Format:%I64d & %I64u SubmitStatus Descriptio...

aiezhen1717的博客 184

POJ 3255 Roadblocks - 次短路

传送门 分析: 记录最短值和次短值,每次dijkstra更新。 注意: 如果用从que中取出的值更新了最短值,那么就将最短值放入que中。 如果用从que中取出的值更新了次短值,那么就将次短值放入que中。 从que中取出值后,设取出的最短/次短值为dist,那么在后续更新中写成\(dis[v] = dist + len\)而非\(dis[v] = dis[u] + len.\),因为无法判断是...

weixin_30381793的博客 126
上一篇: Valid BFS -Manthan, Codefest 18 (rated, Div. 1 + Div. 2)-D题
下一篇: 最小生成树-Kruskal-Conscription-poj3723
Mavis code
博客等级 码龄9年 13粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值