Dijkstra实现最短路径
Posted tao7
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dijkstra实现最短路径相关的知识,希望对你有一定的参考价值。
#include<cstdio> #include<iostream> #include<algorithm> using namespace std; const int MAXV=1000; const int INF=100000000; int n,m,s,G[MAXV][MAXV]; int d[MAXV];//起点到达各点的最短路径长度 bool vis[MAXV]={false}; void Dijkstra(int s){ fill(d,d+MAXV,INF); d[s]=0; for(int i=0;i<n;i++){ int u=-1,MIN=INF; for(int j=0;j<n;j++){ if(vis[j]==false&&d[j]<MIN){ u=j; MIN=d[j]; } } if(u==-1) return; vis[u]=true; for(int v=0;v<n;v++){ if(vis[v]==false&&G[u][v]!=INF&&d[u]+G[u][v]<d[v]){ d[v]=d[u]+G[u][v]; } } } } int main(){ int u,v,w; cin>>n>>m>>s; fill(G[0],G[0]+MAXV*MAXV,INF); for(int i=0;i<m;i++){ cin>>u>>v>>w; G[u][v]=w; } Dijkstra(s); for(int i=0;i<n;i++){ cout<<d[i]<<" "; } return 0; }
测试:
6 8 0
0 1 1
0 3 4
0 4 4
1 3 2
2 5 1
3 2 2
3 4 3
4 5 3
代码解释:
void d(){ //初始化图 //将出发点到出发点的距离设为0 for(循环n次){//n表示顶点数 //设当前欲访问的顶点下标为u=-1; //设所有点中到起点距离最短的那个点的路径长为MAX=100000000000; for(循环n次){ if(第n个点没有被访问&&该点到起点的路径最短){ MAX=最短路径; u=n;//记录该点,即该点已经被访问 } } if(u==-1) return;//所有点已经被访问,函数结束 //标记u点被访问 for(n次循环){ if(该点没有被访问&&该点到新被访问顶点u的距离小于原来路径){ //更新路径 } } } }
视频解释:https://www.bilibili.com/video/av38254646/?redirectFrom=h5
时间复杂度=n*(n+n)
关于该算法的题目和思想后续还会更新
以上是关于Dijkstra实现最短路径的主要内容,如果未能解决你的问题,请参考以下文章