- dijkstra算法的基本思想:
- 1.初始化距离dis[i]=0x3f3f3f3f,且dis[1]=0//1号点到起点的距离为0, 只有起点的距离是确定的
- 2.for循环n次,i从0到n循环,每一次,找到不在book中的距离最近的点t(用数组book存储当前已经确定了最短距离的点)
- 3.把t加到我们的集合当中去,再用t来更新其他点的距离(即从1(假设为起点)到t到x,和从1到x)
每一次迭代都可以确定一个点的最短距离,循环n次就可以求出每个点的最短距离
#include<bits/stdc++.h>
using namespace std;
const int N=510;
typedef long long ll;
int d[N],g[N][N],book[N];
int n,m;
void dijkstra()
{
memset(d,0x3f3f3f3f,sizeof(d));
d[1]=0;
for(int i=1;i<=n;i++)
{
int t=-1;
for(int j=1;j<=n;j++)
{
if(book[j]==0&&(t==-1||d[j]<d[t]))
t=j;
}
book[t]=1;
for(int j=1;j<=n;j++)
{
if(book[j]==0&&d[j]>d[t]+g[t][j])
{
d[j]=d[t]+g[t][j];
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
if(i==j)
{
g[i][j]=0;
}
else
g[i][j]=0x3f3f3f3f;
}
while(m--)
{
int a,b,c;
cin>>a>>b>>c;
g[a][b]=min(g[a][b],c);
}
dijkstra();
if(d[n]==0x3f3f3f3f)cout<<-1<<endl;
else cout<<d[n]<<endl;
return 0;
}