最短路算法总结(dijkstra,flyod,bellmanford,spfa)

2024-06-23 11:20

本文主要是介绍最短路算法总结(dijkstra,flyod,bellmanford,spfa),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

总结

d i j k s t r a dijkstra dijkstra h e a p − d i j k s t r a heap-dijkstra heapdijkstra b e l l m a n f o r d bellmanford bellmanford s p f a spfa spfa f l o y d floyd floyd
最短路类型单源单源单源单源全源
数据维护 e [ u ] d [ u ] v i s [ u ] e[u] d[u] vis[u] e[u]d[u]vis[u] e [ u ] d [ u ] v i s [ u ] e[u] d[u] vis[u] e[u]d[u]vis[u] 优先队列:距离优先 e [ u ] d [ u e[u] d[u e[u]d[u] e [ u ] d [ u ] v i s [ u ] e[u] d[u] vis[u] e[u]d[u]vis[u] 队列:时间优先 d [ u ] d[u] d[u]
算法贪心 松弛 出圈贪心 松弛 入队 出队所有边松弛出队点的出边松弛动态规划(插点法)
负边权不能不能
判负环不能不能
时间复杂度 O ( n 2 ) O(n^2) O(n2) O ( ( m + n ) l o g m O((m+n)logm O((m+n)logm) O ( n m O(nm O(nm) O ( k m n m ) O(km~nm) O(km nm) O ( n 3 ) O(n^3) O(n3)

下附代码实现

dijkstra

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 100000
#define inf 9999999
int n,m,s;
struct edge{int v,w;
};
vector<edge>e[MAX_N+5];
int d[MAX_N+5];
int vis[MAX_N+5];
void dijkstra()
{for(int i=0;i<=n;i++)d[i]=inf;d[s]=0;for(int i=1;i<n;i++){int u=0;for(int j=1;j<=n;j++)if(!vis[j]&&d[u]>d[j])u=j;vis[u]=1;for(auto ed:e[u]){int v=ed.v,w=ed.w;if(d[v]>d[u]+w)d[v]=d[u]+w;}}
}
int main()
{cin>>n>>m>>s;for(int i=1,a,b,c;i<=m;i++){scanf("%d %d %d",&a,&b,&c);e[a].push_back({b,c});}dijkstra();for(int i=1;i<=n;i++)cout<<d[i]<<" ";return 0;
}

heap_dijkstra

基于优先队列优化的dijkstra

#include<iostream>
#include<queue>
#include<vector>
using namespace std;
#define MAX_N 100000
#define inf 0x7f7f7f7f
int n,m,s;
struct edge{int v,w;
};
vector<edge>e[MAX_N+5];
int d[MAX_N+5];
int vis[MAX_N+5];
priority_queue<pair<int,int>>p;
void dijkstra()
{p.push({0,s});for(int i=0;i<=n;i++)d[i]=inf;d[s]=0;while(p.size()){pair<int,int>t=p.top();p.pop();int u=t.second;if(vis[u])continue;vis[u]=1;for(auto ed:e[u]){int v=ed.v,w=ed.w;if(d[v]>d[u]+w){d[v]=d[u]+w;p.push({-d[v],v});}}}
}
int main()
{cin>>n>>m>>s;for(int i=1,a,b,c;i<=m;i++){scanf("%d %d %d",&a,&b,&c);e[a].push_back({b,c});}dijkstra();for(int i=1;i<=n;i++)cout<<d[i]<<" ";return 0;
}

floyd

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 100
#define inf 9999999
int n,m;
struct edge{int v,w;
};
int d[MAX_N+5][MAX_N+5];
int p[MAX_N+5][MAX_N+5];
void floyd()
{for(int k=1;k<=n;k++){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(d[i][j]>d[i][k]+d[k][j]){d[i][j]=d[i][k]+d[k][j];p[i][j]=k;} }}}return ;
}
void path(int i,int j)
{if(!p[i][j])return ;int k=p[i][j];path(i,k);printf("%d",k);path(k,j);return ;
}
int main()
{cin>>n>>m;for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)d[i][j]=inf;d[i][i]=0;}for(int i=1,a,b,c;i<=m;i++){scanf("%d %d %d",&a,&b,&c);d[a][b]=c;}floyd();for(int i=1;i<=n;i++){for(int j=1;j<=n;j++)cout<<d[i][j]<<" ";cout<<endl;}int x,y;cin>>x>>y;cout<<x;path(x,y);cout<<y;return 0;
}

bellmanford

#include<iostream>
#include<vector>
using namespace std;
#define MAX_N 1000000
#define inf 0x7f7f7f7f
struct edge{int v,w;
};
vector<edge>e[MAX_N+5];
int d[MAX_N+5];
int n,m,s;
bool bellmanford()
{bool flag=0;for(int i=0;i<=n;i++)d[i]=inf;d[s]=0;for(int i=1;i<=n;i++){flag=0;for(int u=1;u<=n;u++){if(d[u]==inf)continue;for(auto ed:e[u]){int v=ed.v,w=ed.w;if(d[v]>d[u]+w){d[v]=d[u]+w;flag=1;}}}if(!flag)break;}return flag;
}
int main()
{cin>>n>>m>>s;for(int i=1,a,b,c;i<=m;i++){scanf("%d %d %d",&a,&b,&c);e[a].push_back({b,c});}cout<<bellmanford()<<endl;for(int i=1;i<=n;i++)cout<<d[i]<<" "; return 0;
}

spfa

基于队列优化的bellmanford

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define MAX_N 1000000
#define inf 0x7f7f7f7f
struct edge{int v,w;
};
vector<edge>e[MAX_N+5];
int d[MAX_N+5];
int vis[MAX_N+5];
int cnt[MAX_N+5];
int n,m,s;
queue<int>q;
bool spfa()
{bool flag=0;for(int i=0;i<=n;i++)d[i]=inf;d[s]=0;q.push(s);while(!q.empty()){int u=q.front();vis[u]=0;q.pop();for(auto ed:e[u]){int v=ed.v,w=ed.w;if(d[v]>d[u]+w){d[v]=d[u]+w;cnt[v]=cnt[u]+1;if(cnt[v]>=n)return 0;if(!vis[v])q.push(v),vis[v]=1;}}}return 1;
}
int main()
{cin>>n>>m>>s;for(int i=1,a,b,c;i<=m;i++){scanf("%d %d %d",&a,&b,&c);e[a].push_back({b,c});}cout<<bellmanford()<<endl;for(int i=1;i<=n;i++)cout<<d[i]<<" "; return 0;
}

这篇关于最短路算法总结(dijkstra,flyod,bellmanford,spfa)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/1087010

相关文章

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

MySQL基本查询示例总结

《MySQL基本查询示例总结》:本文主要介绍MySQL基本查询示例总结,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Create插入替换Retrieve(读取)select(确定列)where条件(确定行)null查询order by语句li

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Linux区分SSD和机械硬盘的方法总结

《Linux区分SSD和机械硬盘的方法总结》在Linux系统管理中,了解存储设备的类型和特性是至关重要的,不同的存储介质(如固态硬盘SSD和机械硬盘HDD)在性能、可靠性和适用场景上有着显著差异,本文... 目录一、lsblk 命令简介基本用法二、识别磁盘类型的关键参数:ROTA查询 ROTA 参数ROTA

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解