最短路算法总结(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

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

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