原题链接如下:
Dijkstra作为经典的单源最短路算法,需要我们好好掌握,y总的代码模板比较简洁,每一段都有对应的作用,我们在注释当中的对应位置有详细的解释。
通俗来说,Dijkstra
算法分为以下三个步骤:
- 找到当前未标识的且离源点最近的点
t
- 对
t
号点进行标识 - 用
t
号点更新其他点的距离
849. Dijkstra求最短路 I - AcWing题库
y总的代码模板实在是简洁,在此记录。
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 510;
//题中所给图为稠密图
//因此我们采用邻接矩阵进行存储
int n,m;
int g[N][N];//邻接矩阵存储图
int dist[N];//存储每个结点到起点的最短距离
bool st[N];//已经确定最短距离的点集
int dijkstra()
{
//先对dist数组进行初始化 每个点默认到起点的距离都是无穷大
//除了起点,默认起点的dist初始为0
memset(dist,0x3f,sizeof dist);
dist[1] = 0;
//迭代n次
for(int i=0;i<n;i++)
{
//设定一个temp值,为我在这一轮打算确定的最短路径点
int temp = -1;
//这个循环是去寻找一个可以确定为最短路当中的点
for(int j=1;j<=n;j++)
{
if(!st[j]&&(temp ==-1||dist[j]<dist[temp]))
{
temp = j;
}
}
//确定完该点之后,将该点能到达的点都更新他们的dist
for(int j=1;j<=n;j++)
{
dist[j] = min(dist[j],dist[temp]+g[temp][j]);
}
st[temp] = true;
}
//如果起点到不了这个点
if(dist[n]==0x3f3f3f3f)return -1;
return dist[n];
}
int main()
{
cin>>n>>m;
//对邻接矩阵进行初始化
memset(g,0x3f,sizeof g);
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
//存在重边和自环 因此我们需要对重复边进行处理,留最短的就行
g[a][b] = min(g[a][b],c);
}
cout<<dijkstra()<<endl;
return 0;
}