Dijkstra算法——计算一个点到其他所有点的最短路径的算法
Posted lcezych
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra算法——计算一个点到其他所有点的最短路径的算法相关的知识,希望对你有一定的参考价值。
迪杰斯特拉算法百度百科定义:传送门
迪杰斯特拉算法用来计算一个点到其他所有点的最短路径,是一种时间复杂度相对比较优秀的算法 O(n2)(相对于Floyd算法来说)
是一种单源最短路径算法,但是它并不能处理负边权的情况
板子代码:
#include<cstdio> #include<iostream> #include<cstdlib> #include<iomanip> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<time.h> #include<queue> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pr; const double pi=acos(-1); #define rep(i,a,n) for(int i=a;i<=n;i++) #define per(i,n,a) for(int i=n;i>=a;i--) #define Rep(i,u) for(int i=head[u];i;i=Next[i]) #define clr(a) memset(a,0,sizeof a) #define pb push_back #define mp make_pair #define fi first #define sc second ld eps=1e-9; ll pp=1000000007; ll mo(ll a,ll pp){if(a>=0 && a<pp)return a;a%=pp;if(a<0)a+=pp;return a;} ll powmod(ll a,ll b,ll pp){ll ans=1;for(;b;b>>=1,a=mo(a*a,pp))if(b&1)ans=mo(ans*a,pp);return ans;} ll read(){ ll ans=0; char last=‘ ‘,ch=getchar(); while(ch<‘0‘ || ch>‘9‘)last=ch,ch=getchar(); while(ch>=‘0‘ && ch<=‘9‘)ans=ans*10+ch-‘0‘,ch=getchar(); if(last==‘-‘)ans=-ans; return ans; }//快读 //head const int maxn=5001; int g[maxn][maxn];//g数组用来存储图; int n,m,s;//分别表示点的个数、有向边的个数、出发点的编号; bool vis[maxn];//表示是否已经到达过; int d[maxn];//d[i]表示从询问点到点i的最短路径; const int inf=2147483647; int main () { n=read(),m=read(),s=read(); rep(i,1,n) { d[i]=inf; rep(j,1,n) g[i][j]=inf; g[i][i]=0;//自己到自己的最短路径当然是0 }//初始化数组; rep(i,1,m) { int u=read(),v=read(),w=read(); //u,v,i分别表示第i条有向边的出发点、目标点和长度; g[u][v]=w;//读入; } vis[s]=1;//将起点标记成已经到达; rep(i,1,n) d[i]=g[s][i];//将最短路径初始化; //如果两点之间有路线就初始化为该距离,如果没有就还是inf; while(1) { int stt_node=0,stt_dis=inf;//stt=shortest 初始化两个变量 // stt_node表示最短路径的终点,stt_dis表示最短路径的长度 rep(i,1,n) { if(vis[i]==0&&d[i]<stt_dis) //如果该点还没有到达,并且他的距离小于最短距离 { stt_node=i,stt_dis=d[i];//更新变量 } } if(stt_node==0) break; //如果已经没有可以更新的最短路径了,就说明已经结束了 vis[stt_node]=1;//将该点标记成已经到达 rep(i,1,n) { if(vis[i]||g[stt_node][i]==inf)continue; //如果并没有到达或者是两点之间没有路径,就跳出循环 d[i]=min(d[i],stt_dis+g[stt_node][i]);//更新最短路径 } } rep(i,1,n) printf("%d ",d[i]); return 0; }
以上是关于Dijkstra算法——计算一个点到其他所有点的最短路径的算法的主要内容,如果未能解决你的问题,请参考以下文章