图论最短路(模板/模板题)

最短路问题(五个算法模板) 题目给定一个有向图,图中有 𝑛n 个点和 𝑚m 条边。图中可能存在重边和自环,所有边权均为正值。请你求出从 1 号点到 𝑛n 号点的最短距离。如果无法从 1 号点走到 𝑛n 号点,则输出 -1。 阅读详情

最短路问题就是字面意思 求解两点之间的最短路程/时间

最短路一般有四种算法模板

ad4158b3a3514d6caa65ecfd8e8d0f87.png

图的存储一般有三种方法

1.邻接矩阵

直接开一个二维数组mp[x][y]表示 x---->y的距离如果存在重边(平行边)存储最短的即可因为求的是最短路嘛hhhhh 

2.邻接链表的方法

用结构体存储边的所有信息 终点 权值再用一个vecotr<struct>e[N]

e[i]就表示所有以i为起点的边

具体code:

struct node{
    int from,to,w;//分别表示起点终点个权
}edge;
vector<edge>e[N];
void add(int a,int b,int c){
    e[a].push_back(a,b,c);
}

因为是动态存储所以效率较低不推荐使用

3.链式前向星

有点类似于哈希表里的拉链法用一个数组h[]表示头h[i]表示以i为起点的所有边 在一个头下面拉一个链表(模拟链表)

两种实现方法

1.结构体法

struct node{
    int from,to,w,next;//分布表示起点,终点,权,以i为起点的下一条边的下标值
}egde[N];
int h[N],idex;
void add(int a,int b,int c){
    edge[idex]={a,b,c,h[a]};
    h[a]=idex++;
}//模拟链表的添加

2.数组法

h[]表示头 e[]表示终点 ne[]表示下一条以i为起点的下一条边的下标值 w[]表示权

int h[N],e[N],ne[N],w[N],idex;
void add(int a,int b,int c){
    e[idex]=b;
    w[idex]=c;
    ne[idex]=h[a];
    h[a]=idex++;
}

上述三种方法适合用的时机为:确定题目需要建的图是稀疏图还是稠密图 稀疏用邻接矩阵 稠密图用邻接链表/链式前向星 

 从最简单的Dijkstra开始说起

手动实现的稀疏矩阵好像更好一点 因为是静态的 再来需要一个数组记录距离起点的距离 dist[N] 还有一个数组记录这个点到起点的距离是不是最短距离
这里有一个小定理 就是对于当前点为起点的所有未被确认为最短距离邻接边最短的一定是这个点到起点的最短距离 拥有这些东西 就可以解决问题了(这个定理就是Dij的实现原理)下面以一个模板题目来看一下具体操作

题目描述:
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为正值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式
第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围
1≤n≤500,
1≤m≤105,
图中涉及边长均不超过10000。

输入样例:
3 3
1 2 2
2 3 1
1 3 4
输出样例:
3

题源:acwing

code:

#include<bits/stdc++.h>
using namespace std;
const int N=510;
int g[N][N],dis[N],n,m;//dis表示从i点到起点的距离
bool st[N];//表示i点是否确定了最短距离
int Dijkstra(){
    memset(dis,0x3f,sizeof(dis));//注意初始化
    dis[1]=0;
    for(int i=1;i<=n;i++){
        int t=-1;
        for(int j=1;j<=n;j++){
            if(!st[j]&&(t==-1||dis[t]>dis[j]))t=j;//寻找还没有确定最短距离的点的最小(定理的应用)
        }
        st[t]=true;
        for(int j=1;j<=n;j++)dis[j]=min(dis[j],dis[t]+g[t][j]);//跟新暂时最短距离
    }
    if(dis[n]==0x3f3f3f3f)return -1;
    else return dis[n];
}
int main(){
    cin>>n>>m;
    int x,y,c;
    memset(g,0x3f,sizeof(g));//因为可能出现重边
    while(m--){
        scanf("%d%d%d",&x,&y,&c);
        g[x][y]=min(g[x][y],c);
    }
    cout<<Dijkstra()<<endl;
}

2.Dij堆优化版

这个版本适用于稀疏图

优化的点就是 寻找还没确定最短路径的边的最小值的时候 直接将边放入一个优先队列中然后从队头取出如果这个边确定了最短边再取出一个即可

题目描述:
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环,所有边权均为非负值。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 −1。

输入格式
第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 −1。

数据范围
1≤n,m≤1.5×105,
图中涉及边长均不小于 0,且不超过 10000。
数据保证:如果最短路存在,则最短路的长度不超过 109。

输入样例:
3 3
1 2 2
2 3 1
1 3 4
因为是稀疏图用邻接链表
 

#include<bits/stdc++.h>
using namespace std;
const int N=150010;
int h[N],e[N],ne[N],w[N],dis[N],n,m,idex;
bool st[N];//表示是否确定了最短距离
typedef pair<int,int>PII;
priority_queue<PII,vector<PII>,greater<PII> >q;
void add(int a,int b,int c){
    e[idex]=b;
    ne[idex]=h[a];
    w[idex]=c;
    h[a]=idex++;
}
int Dijkstra(){
    memset(dis,0x3f,sizeof(dis));
    dis[1]=0;
    q.push({0,1});
    while(!q.empty()){
        int distance=q.top().first,id=q.top().second;
        q.pop();
        if(st[id])continue;
        st[id]=1;
        for(int i=h[id];i!=-1;i=ne[i]){
            if(dis[e[i]]>dis[id]+w[i])dis[e[i]]=dis[id]+w[i];
            q.push({dis[e[i]],e[i]});
        }
    }
    if(dis[n]==0x3f3f3f3f)return -1;
    else return dis[n];
}
int main(){
    cin>>n>>m;
    int a,b,c;
    memset(h,-1,sizeof(h));
    while(m--){
        scanf("%d%d%d",&a,&b,&c);
        add(a,b,c);
    }
    cout<<Dijkstra()<<endl;
} 

注意:Dij只能用于无负权边的情况

2.bellman-ford(可以处理负权边)

Bellman_ford求最短路一般解决的问题都是存在负边 或者 最短路有边个数量限制的 而且Bellman_ford中存边的信息直接用结构体存储比较简单 bellman_ford大概的思路就是一个二重循环第一个循环循环n次第二个循环遍历每一个边用每一个边更新与其相邻的点到终点的距离即可(第一重循环n次的实际意义就是从起点到目标的不超过n条边的最短路)

例题:

题目描述:
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。

请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离,如果无法从 1 号点走到 n 号点,输出 impossible。

注意:图中可能 存在负权回路 。

输入格式
第一行包含三个整数 n,m,k。

接下来 m 行,每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

点的编号为 1∼n。

输出格式
输出一个整数,表示从 1 号点到 n 号点的最多经过 k 条边的最短距离。

如果不存在满足条件的路径,则输出 impossible。

数据范围
1≤n,k≤500,
1≤m≤10000,
1≤x,y≤n,
任意边长的绝对值不超过 10000。

输入样例:
3 3 1
1 2 1
2 3 1
1 3 3
输出样例:
3

code:

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int n,m,k,dist[N],backup[N];/*记录上次各个点到起点的最短路(暂时)因为循环的边没有顺序如果不记录上次的点的距离的话 那么这个点可能已经在前面已经被更新过了而我们的操作就错误了*/
struct node{
int from,to,w;
}edge[N];
int bellman_ford(){
	memset(dist,0x3f,sizeof(dist));
	dist[1]=0;
	for(int i=0;i<k;i++){//循环k次的意义就是边数小于等于k的最短路
		memcpy(backup,dist,sizeof(dist));
		for(int j=1;j<=m;j++){
			int a=edge[j].from,b=edge[j].to,c=edge[j].c;
			dist[b]=min(dist[b],backup[a]+c);
		}
	}
	return dist[n];
}
int main(){
	cin>>n>>m>>k;
	int a,b,c;
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&a,&b,&c);
		edge[i]={a,b,c};
	}
 int t=bellman_ford();
if(t>0x3f3f3f3f/2)cout<<"imposiable";
else cout<<t;
}

 spfa(bellman的优化)

pfa是对bellman_ford的优化不再去循环比较每一个边是否能更新最短路 而是通过如果当前点的最短路变化那么其他的邻接边的最短路一定也变化的思想
所以只需要一个队列将这些最短路变化的点存入即可 然后再需要一个数组来记录每一个点是否在队列里 防止重复

例题

题目描述:
给定一个 n 个点 m 条边的有向图,图中可能存在重边和自环, 边权可能为负数。

请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出 impossible。

数据保证不存在负权回路。

输入格式
第一行包含整数 n 和 m。

接下来 m 行每行包含三个整数 x,y,z,表示存在一条从点 x 到点 y 的有向边,边长为 z。

输出格式
输出一个整数,表示 1 号点到 n 号点的最短距离。

如果路径不存在,则输出 impossible。

数据范围
1≤n,m≤105,
图中涉及边长绝对值均不超过 10000。

输入样例:
3 3
1 2 5
2 3 -3
1 3 4
输出样例:
2
code:

#include<bits.stdc++.h>
using namespace std;
const int N=100010;
int h[N],e[N],ne[N],w[N],idex,n,m,dist[N];
bool st[N]//判断当前点是否在队列里
void add(int a,int b,int c){
	e[idex]=b;
	ne[idex]=h[a];
	w[idex]=c;
	h[a]=idex++;
}
int spfa(){
	memset(dist,0x3f,sizeof(dist));
	dist[1]=0;
	st[1]=true;
	queue<int>q;
	while(!q.empty()){
	int pos=q,front();
	q.pop();
	st[pos]=false;
	for(int i=h[pos];i!=-1;i=ne[i]){
		if(dist[e[i]]>dist[pos]+w[i]){//如果距离变短就更新并且放入因为这个点的变小可能会引起其他点的变小
			dist[e[i]]=dist[pos]+w[i];
			if(!st[e[i]])q.push(e[i]),st[e[i]]=true;
		}
	}
	return dist[n];
}
int main(){
	cin>>n>>m;
	int a,b,c;
  	while(m--){
		cin>>a>>b>>c;
		add(a,b,c)
	}
	int t=spfa();
	if(t==0x3f3f3f3f)cout<<"impossible";
	else cout<<t<<endl;
} 

spfa判断负环

什么是负环

例如

f77a8e3662e7415a88fdab2db3022ce8.png

 我们目标是从1到5的最短路但是可以发现从2——>3——>4——>2这个环上总和是一个负数每多走一圈距离就变短一次所以这个1——5的最短路为-∞那么怎么判断呢 根据抽屉原理可以得知n个点里任意两个点的任意路程如果不经过重复的点那么边的个数一定小于n 那么可以根据此方法来判断负环 维护一个cnt数组表示从起点到当前点的最短路的边 只要出现一个cnt[i]>n就一定有负环出现值得注意的是 负环不一定从1点可以到达 所以我们要把所有的点都当作起点枚举一下寻找

code:

#include<bits/stdc++.h>
using namespace std;
const int N=100010;
int h[N],ne[N],e[N],w[N],dist[N],n,m,cnt[N],idex;
bool st[N];
void add(int a,int b,int c){
	e[idex]=b;
	ne[idex]=h[a];
	w[idex]=c;
	h[a]=idex++;
}
bool spfa(){
	queue<int>q;
	for(int i=1;i<=n;i++)q.push(i),st[i]=true;
	while(!q.empty()){
		int pos=q.front();
		q.pop();
		st[pos]=false;
		for(int i=h[pos];i!=-1;i=ne[i]){
			if(dist[e[i]]>dist[pos]+w[i]){
				dist[e[i]]=dist[pos]+w[i];
				cnt[e[i]]=cnt[pos]+1;
				if(!st[e[i]])st[e[i]]=true,q.push(e[i]);
				if(cnt[e[i]]>=n)return true;
			}
		}
	}
	return false;
}
int main(){
	memset(h,-1,sizeof(h));
	int a,b,c;
	cin>>n>>m;
	while(m--){
		scanf("%d%d%d",&a,&b,&c);
		add(a,b,c);
	}
	if(spfa())cout<<"Yes"<<endl;
	else cout<<"No"<<endl;
}

 

 

洛谷 最短路径计数 Dijkstra模板题 共 N 行,每行一个非负整数,第 i 行输出从顶点 1 到顶点 i 有多少条不同的最短路,由于答案有可能会很大,你只需要输出 ansmod100003 后的结果即可。给出一个 N 个顶点 M 条边的无向无权图,顶点编号为 1∼N。接下来 M 行,每行 2 个正整数 x,y,表示有一条连接顶点 x 和顶点 y 的边,请注意可能有自环与重边。//存储第i条边的起点。//指针,表示第几条边。 阅读详情

相关推荐

linux操作系统使用以太网连接ubuntu,设置固定ipv4

首先,您需要确定要配置的网络接口。可以使用ifconfig -a或ip addr命令来列出当前系统上的所有网络接口及其相关信息。找到您要配置的网络接口名称,例如eth0、ens33或enp0s3;保存并关闭文件后,您需要重启网络服务以使更改生效。在linux操作系统中,要使用交换机连接以太网可以直接使用交互界面;如果你的操作系统没有交互界面,你可以使用命令方式配置;点击ipv4,方式为手动,可以设置ip和子网了;开头,后接网络接口名称。第三步:点击有线最右边圆形控件;第二步:点击有线设置;

2301_79311842的博客 2404

最短路专题【完结】

第一题 hdu 1317 XYZZY 点击打开hdu 1317 思路: 1 题目的图是一个有向图,并且可能存在环。第一个点的能量值为100,边的权值利用能量大小,例如2点为-60,如果1-&gt;2那么value[1][2] = -602 题目明确指出如果是要win的话,那么必须是经过的每条边都要大于0.那么我们只要把那些经过松弛操作后的点大于0的入队即可,小于等于0的点肯定不会出现在最...

我是传奇 228

thinkcmf 代码执行 (CVE-2019-7580) 漏洞复现

所有文章,仅供安全研究与学习之用,后果自负! thinkcmf 代码执行 CVE-2019-7580thinkcmf 代码执行 (CVE-2019-7580)0x01 漏洞描述0x02 影响范围0x03 漏洞复现3.1 登录后台3.2 漏洞利用3.2.1webshell3.2 phpinfo3.3 获取系统命令0x04 漏洞修复 thinkcmf 代码执行 (CVE-2019-7580) 复现小心会搞崩环境。 0x01 漏洞描述 ThinkCMF是一款支持Swoole的开源内容管理框架(CMF),基于Thi

YouthBelief的博客 4263

求最短路模板详解(floyed()算法、dijkstra()算法、spfa()算法、bellman-ford()算法)

对于 100%100% 的数据,1≤n≤103,11≤m≤105,1≤u,v≤n,1≤w≤104,输入保证任意两点都能互相到达。请你求出从 1 号点到 n号点的最多经过 k条边的最短距离,如果无法从 1号点走到 n号点,输出。请你求出 1号点到 n号点的最短距离,如果无法从 1号点走到 n 号点,则输出 −1。请你求出 1 号点到 n 号点的最短距离,如果无法从 1 号点走到 n 号点,则输出。.求从1号点到剩下(n-1)个点的距离的和以及从(n-1)个点到1号点的最短距离和。

m0_73557680的博客 1537

ArcGIS Pro中文帮助离线包安装指南:版本匹配与操作详解

本文详细指导如何为ArcGIS Pro安装中文帮助离线包,解决在线帮助访问不畅的问题。核心在于确保软件版本与离线包的精确匹配,并提供了从版本查看、离线包获取、安装步骤到软件内配置的完整操作流程。文中重点强调了版本匹配的重要性,并分享了高效使用本地帮助搜索及管理多版本帮助的实用技巧。

whisky的博客 989

实战ByteTrack:用C++手把手教你实现多目标跟踪(附完整代码解析)

本文通过C++实战教程,手把手教你实现ByteTrack多目标跟踪算法。文章详细解析了算法核心,包括利用卡尔曼滤波进行状态预测、匈牙利算法完成数据关联,以及ByteTrack独特的三次匹配策略来有效处理低置信度检测框,并提供了完整的项目架构、代码实现与性能优化指南。

yolo5detector的博客 299

牛客练习赛27C+经过每个点的最短路+邻接表+bfs根节点到叶节点的最长路

题目链接:https://www.nowcoder.com/acm/contest/188/C 题目大意:给你n个点,他们用n-1条边无向联通,,每条边都有一个长度,给你一个初始的起点,让你起点出发,求经过每个点一次的最短路。 输入: 第一行两个整数 n,x,代表点数,和起点的位置 第二到第n行,每行三个整数 u,v,w,表示u和v之间有一条长为w的道路 输出: 一个数表示答案 思路:首先看到这...

H_ang的博客 546

一步步教你使用 NVIDIA 推出的全新GPU加速求解器 cuOpt:解锁超高效率的求解体验

未完成

Linshaodan520的博客 869

最短路简介

在图论中最短路径是两个节点之间经过的边权值之和最小的路径,是一种在图上的搜索,满足最优子结构(可以使用动态规划和贪心算法)最优子结构:最短路径的子路径也是最短路径(有可以到达的负环的图不满足最优子结构)

m0_62494327的博客 1066

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1274

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

TIA博途中通过UDT实现IO地址映射到DB块中的具体方法

Robot_PLC_HMI_Automation 1万+

最短路 算法解析+例题

最短路可以认为是图论最基础的内容之一,涉及到的算法也很多。为了方便,假设图有 $n$ 个点,$m$ 条边,$(u,v)$ 这条边的边权用 $w(u,v)$​ 表示。 ### 性质 有几条关于**边权为正**的图的最短路的性质: - 任意两点之间的最短路,不会经过重复的点和边。 - 任意两点之间的最短路,结点数不会超过 $n$,边数不会超过 $n-1$。 对于前者,由于边权为正,如果一条最短路需要经过重复的点或边,更优的做法显然是在**第一次经过这个点或者边时**

UnderTheTimeの博客 2687

蓝牙模块HM-10手册

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

G - 数据结构实验之图论七:驴友计划(最短路模板题Floyd算法/Dijkstra算法)

Description 做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。 Input 连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息

qq_45830025的博客 337

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

HDU 5521.Meeting 最短路模板题

Meeting Time Limit: 12000/6000 MS (Java/Others)Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 3361Accepted Submission(s): 1073 Problem Description Bessie and her friend Els...

weixin_30640769的博客 156

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++图论基础单源最短路-常规版dijkstra算法/堆优化版dijkstra算法/bellman-ford 算法/spfa 算法流食般投喂

spfa算法其实就是用队列优化的Bellman-Ford算法,因为我们知道,Bellman-Ford算法中,在执行单次操作时,并不是所有边都进行了有效的松弛操作,只有经松弛操作之后的节点的出边才可能会继续有松弛操作,所以,我们用了队列来优化,队列里面存着经过松弛操作后待处理节点,从队列里面拿出来时,这个节点在呆在队列的过程中,别的节点进行松弛操作,连带着他已经经过一次或者多次,已经充分进行了松弛操作,所以,出队列时,我们拿到的就是最新最好的结果,这样我们也不要有。bool st[N]。

江屿风的博客 9540

图论01.最短路专题_学习笔记+模板

图论01.最短路专题_学习笔记+模板 一、定义与性质 ● 需要的前导知识点 路径 最短路 有向图中的最短路、无向图中的最短路 单源最短路、每对结点之间的最短路 ● 最短路的性质 对于边权为正的图,任意两个结点之间的最短路,不会经过重复的结点。 对于边权为正的图,任意两个结点之间的最短路,不会经过重复的边。 对于边权为正的图,任意两个结点之间的最短路,任意一条的结点数不会超过 nnn ,边数不会超过 n−1n-1n−1 。 二、最短路算法与模板 1.Floyd–适用于无负环图的最短路算法 用于求解图中任

HeartFireY的博客 2425

A*算法+最短路实现K短路+模板题

&lt;font color=black size=4&gt;K短路问题还是很普遍的,了解一下K短路很有必要,顺便学会A*的简单应用更好。 A*算法,是一种启发式搜索算法,我们可以自己设定一个估价函数,这样我们的搜索过程就会优先选择有更好的估价函数的点进行搜索。 在最短路中,A*的估价函数定义如下:f(p)=g(p)+h(p),g(p)表示当前从起始点s到点p的距离,而h(p)就是从终点到p的最短...

Q755100802的博客 1373

[图+最短路+模板] 五大最短路常用模板

文章目录0. 前言1. 朴素 Dijkstra 算法求最短路2. 堆优化 Dijkstra 算法求最短路3. Bellman-Ford 算法求最短路 0. 前言 图论中最短路问题一般有两大类,然后在这两大类的基础上再细分为几个子项,下面简单梳理下知识点,总共 5 大最短路算法: 单源最短路: 源点,就是起点的意思。汇点,就是终点的意思。从一个点到所有点的最短距离。例,求解 1 号点到 n 号点的最短路,那么我们可以求解出从 1 号点到 n - 1 号点的所有最短路,那么显然,从 1 号点到 n 号点的最短

Y-puyu 的博客 1108

(图论) 最短路

最短路问题是图论中最经典的题型之一。现在主流的有5中算法可以解决Dijstra Floyd Bellman Frod SPFA Johnson 743. 网络延迟时间 787. K 站中转内最便宜的航班 P3385 【模板】负环 World Exhibition - 3592 P5905 【模板】Johnson 全源最短路 Dijstra (朴素) 适用于稠密图 ...

cuber-lotus的博客 903

【算法基础篇】(三十七)图论基础之单源最短路:从原理到实战,4 大算法彻底吃透!

本文系统介绍了4种经典单源最短路算法及其应用场景。Dijkstra算法(常规版和堆优化版)适用于非负权图,时间复杂度分别为O(n²)和O(mlogn)。Bellman-Ford算法通过n-1轮松弛处理负权边,可检测负环,复杂度O(nm)。SPFA作为其优化版本,平均复杂度O(km)。文章详细分析了各算法的核心思想、代码实现和适用条件,并提供了洛谷模板题解答。最后通过邮递员送信和最短路计数两个变形问题,展示了算法的实际应用。针对不同场景,给出了选择算法的三步决策法:判断负权边→检测负环需求→考虑数据规模。

2301_79248256的博客 1306

最短路基础模板题

有一个n个点m条边的无向图,请求出从s到t的最短路长度。

na208702973的博客 880

【图论01】最短路 1001 最短路

算法思路:Dijkstra算法,简单的模板题。 刚开始没有吧w数组初始化,WA了三次,改过来之后成功AC。 //模板开始 #include #include #include #include #include #include #include #include #include #include #in

liuzhushiqiang的专栏 838

图论模板题及分析

算法基础中图论涉及的各种算法详解和模板题拆分理解

磊哥哥讲算法 774

最短路题目汇总与总结

主要介绍了本人在洛谷上刷的最短路类型的题目的经验总结

qq_51506533的博客 1184

图论——最短路

2020暑假算法复习(3)——最短路

qq_44965626的博客 320
上一篇: 散列表/哈希表 字符串的哈希
下一篇: 二分图/二分图最大匹配(匈牙利算法)
姐姐带你拿捏大厂算法
博客等级 码龄5年 17粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值