目录
一:算法框架
使用临接矩阵来存储每两个点之间的距离,
再使用一个数组存储源点到其他点的距离,
使用一个bool数组来判断某个点是否已经被使用过,如果该点被遍历过那么该点到源的距离确定且最短;
二:实现步骤
1- 从源点开始依次选择离源点最近的点(包括源点但跳过)
2-之后确定该点与源点的距离,bool数组对应的位置为真,
3-从找到的点开始拓展该点到源点再到该点下一点的距离与该点下一点的距离到源点的距离,取最小值赋值给下一点对应的距离数组;
4-重复前面步骤,直到结束;
三,代码实现
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N=510;
int a[N][N], dis[N];
int n,m;
bool b[N];
int dijkstra()
{
memset(dis,0x3f,sizeof dis);//把每个点到源点的距离初始化为最大值
dis[1]=0;
for(int i=0;i<n;i++)
{
int t = -1;
//寻找离源点最近的点
for(int j = 1; j <= n; j++) if( !b[j] && ( t == -1|| dis[j] < dis[t] )) t = j;//t到源点的距离比j远,更新t
b[t]=true;
//寻找离t最近的点
//拓展一条源点到z的路径,已知源点到t距离以确定为最近
for(int z=1;z<=n;z++)
{
//比较dis[t]+a[t][z]与dis[z]的大小
dis[z]=min(dis[t]+a[t][z],dis[z]);
}
}
if(dis[n]==0x3f3f3f3f)return -1;
else return dis[n];
}
int main()
{
cin>>n>>m;
memset(a,0x3f,sizeof a);
for(int i=0;i<m;i++)
{
int x,y,z;
cin>>x>>y>>z;
a[x][y]=min(a[x][y],z);
}
int t=dijkstra();
cout<<t<<endl;
return 0;
}