P2865 [USACO06NOV] Roadblocks G

*原题链接*

次短路模版题

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

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

cpp 复制代码
#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;
}
相关推荐
程序员-King.20 小时前
day158—回溯—全排列(LeetCode-46)
算法·leetcode·深度优先·回溯·递归
优雅的潮叭21 小时前
c++ 学习笔记之 chrono库
c++·笔记·学习
星火开发设计21 小时前
C++ 数组:一维数组的定义、遍历与常见操作
java·开发语言·数据结构·c++·学习·数组·知识
月挽清风21 小时前
代码随想录第七天:
数据结构·c++·算法
小O的算法实验室21 小时前
2026年AEI SCI1区TOP,基于改进 IRRT*-D* 算法的森林火灾救援场景下直升机轨迹规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
小郭团队1 天前
2_1_七段式SVPWM (经典算法)算法理论与 MATLAB 实现详解
嵌入式硬件·算法·硬件架构·arm·dsp开发
充值修改昵称1 天前
数据结构基础:从二叉树到多叉树数据结构进阶
数据结构·python·算法
Deepoch1 天前
Deepoc数学大模型:发动机行业的算法引擎
人工智能·算法·机器人·发动机·deepoc·发动机行业
点云SLAM1 天前
C++内存泄漏检测之Windows 专用工具(CRT Debug、Dr.Memory)和Linux 专业工具(ASan 、heaptrack)
linux·c++·windows·asan·dr.memory·c++内存泄漏检测·c++内存管理
浅念-1 天前
C语言小知识——指针(3)
c语言·开发语言·c++·经验分享·笔记·学习·算法