题目
有n个点,m条边,接下来有m条数据,每条数据包含u,v,w,表示用u到v的距离为w,求从1到n的最短路径是多少。
输入
3 3
1 2 2
2 3 1
1 3 4
输出
3
解题思路
1,初始化,我们把每个点到点1的距离都初始化为无穷大。
2,把点1距离它自己的距离设为0,dis[1]=0。
3,我们要循环n次,在循环的每一次都要找到距离点1最小的点,在这个最小的点的基础上,更新所有点的距离。
4,dis[n]即为本题的答案。
代码
#include<bits/stdc++.h>
using namespace std;
int n, m;
const int N = 510;
int g[N][N]; //链接矩阵 用于稠密图
int dis[N];
bool st[N];
int Dijkstra(){
memset(dis, 0x3f3f3f3f, sizeof dis);
dis[1] = 0;
//循环n次,在更新完所有距离后,找到下一个未被标记的最小距离的点
for(int i = 1; i <= n; i++){
int t = -1;
//找到距离最小的那个点
for(int j = 1; j <= n; j++){
if(!st[j] && (t == -1 || dis[t] > dis[j])){
t = j;
}
}
//把这个最小的点标记为已使用
st[t] = true;
//更新所有距离
for(int j = 1; j <= n; j++){
dis[j] = min(dis[j], dis[t] + g[t][j]);
}
}
if(dis[n] == 0x3f3f3f3f)return -1;
else return dis[n];
}
int main(){
cin >> n >> m;
memset(g,0x3f3f3f3f, sizeof g);
for(int i = 1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
g[a][b] = min(g[a][b], c);
}
int s = Dijkstra();
cout << s << endl;
return 0;
}
欢迎大家讨论指正!!!