P2865 [USACO06NOV] Roadblocks G

devtools/2024/9/22 8:13:30/

*原题链接*

次短路模版题

在刚学最短路时,我做过这道题集合位置,那时博客上写的是枚举删除最短路上的边,然后求解。不过这种做法最坏时间复杂度可以有O(m^2logn),对于这道题数据范围较大,所以可以用更好写,思维难度也不高的方法来解决。

首先记录dist_{i,0/1}数组,分别表示到i最短路次短路。设此时用t更新y,则我们分别考虑如何更新最短路次短路,在就是本题求的是严格次短路,注意判断条件。具体见代码注释。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;int read(){int x=0,f=1;char ch=getchar();while(!isdigit(ch)){if(ch=='-') f=-1;ch=getchar();}while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();return x*f;
}int n,m,head[N],tot,dist[N][2],vis[N];struct node{int to,nxt,w;
}edge[N*2];
void add(int x,int y,int w){edge[++tot].to=y;edge[tot].w=w;edge[tot].nxt=head[x];head[x]=tot;
}void spfa(int s){queue<int> q;memset(dist,0x3f,sizeof(dist)),memset(vis,0,sizeof(vis));q.push(s),dist[s][0]=0,vis[s]=1;while(!q.empty()){int t=q.front();q.pop();vis[t]=0;for(int i=head[t];i;i=edge[i].nxt){int y=edge[i].to;if(dist[y][0]>dist[t][0]+edge[i].w){//可以更新最短路dist[y][1]=dist[y][0];别忘了先更新y的次短路dist[y][0]=dist[t][0]+edge[i].w;if(!vis[y]) vis[y]=1,q.push(y);}//不能更新y的最短路,但可以用t的最短路更新y的次短路if(dist[y][1]>dist[t][0]+edge[i].w&&dist[t][0]+edge[i].w>dist[y][0]){dist[y][1]=dist[t][0]+edge[i].w;if(!vis[y]) vis[y]=1,q.push(y);//这时也要入队}//用t的次短路更新y的次短路if(dist[y][1]>dist[t][1]+edge[i].w){dist[y][1]=dist[t][1]+edge[i].w;if(!vis[y]) vis[y]=1,q.push(y);}}}
}int main(){n=read(),m=read();for(int i=1;i<=m;i++){int x=read(),y=read(),w=read();add(x,y,w),add(y,x,w);}spfa(n);cout<<dist[1][1]<<endl;return 0;
}


http://www.ppmy.cn/devtools/113856.html

相关文章

【最新解决方案】 Unknown encoder ‘libx264‘

文章目录 一、报错原因二、解决方案①方案一&#xff08;市面上 常见方案&#xff09;②方案二&#xff08;我的方案 已解决&#xff09; 一、报错原因 问题起因&#xff1a;在使用ffmpeg 进行视频合成过程中&#xff0c;在推流时报没有libx264编码。 我方案一失效了&#xff…

C# 设计模式之状态模式

总目录 前言 状态模式在我们的现实生活中也有类似的例子&#xff0c;例如&#xff1a;在我们上网购买商品的过程中&#xff0c;就可以查看订单的实时状态。对于商家来说&#xff0c;订单的状态不同&#xff0c;也会允许客户有不同的动作要求&#xff0c;比如&#xff1a;订单在…

pdf文件转图片,base64或保存到本地

pdf转图片&#xff0c;需要引入pdfbox依赖 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.27</version> </dependency>RequestMapping("pdfToImg") public void …

一天认识一个硬件之显示器

今天还是来给大家分享一个日常都能用到的&#xff0c;显示器&#xff0c;也叫显示屏&#xff0c;屏幕&#xff0c;怎么叫的都有&#xff0c; 先来分享一下什么是显示器&#xff0c;显示器是一种将电子文件通过特定的传输设备显示到屏幕上的显示工具&#xff0c;它的作用是将计…

【C++】多态的认识和理解

个人主页 文章目录 ⭐一、多态的概念&#x1f384;二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 &#x1f3e0;三、纯虚函数和抽象类的关系&#…

redis的一主二从三哨兵配置

redis安装脚本 参考了&#xff1a;https://yunweiba.com/163.html https://download.redis.io/releases/ 在上面链接选择合适的版本 wget -P "/opt" https://download.redis.io/releases/redis-7.0.0.tar.gz安装脚本如下&#xff1a; #!/bin/bash # 安装redis&a…

音视频直播应用场景探讨之RTMP推流还是GB28181接入?

技术背景 好多开发者跟我们沟通音视频解决方案的时候&#xff0c;不清楚什么时候用RTMP推送模块&#xff0c;什么时候用GB28181设备接入模块&#xff0c;也不清楚二者差异化。实际上&#xff0c;RTMP推流和GB28181接入模块&#xff0c;在很多方面存在差异&#xff0c;如应用领…

实时系统资源监测:AutoPowerOptionsOK确保电脑性能与节能兼备

科技赋予生活翅膀&#xff0c;让我们在快节奏中翱翔&#xff0c;协调工作与梦想&#xff0c;让每一个梦想都有机会照进现实&#xff0c;绽放光彩——科技的进步不仅推动了社会的发展&#xff0c;也极大地改善了人们的日常生活。在众多科技成果中&#xff0c;电脑作为信息处理的…