n是点 m是边的个数
朴素版的 Dijkstra求最短路问题(都是正权值)
步骤:
dis表示的是距离起点的距离 st表示这个点的距离确定没有
1、初始化距离 让全部的dis全都为0x3f 但是要让dis[1]=0
2、有n个点要进行n次迭代 在每次迭代的过程中去找到不在集合中 并且dis[j]最小
3、然后根据2找到的这个数去更新其他的dis[]
4、要是n和m的差距很大的化 就可以用邻接矩阵
需要注意的是 刚开始st[1] 不要赋值为true 因为要从起点1进行去迭代其他的点
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int a[N];
int n, m;
string s;
int g[1010][1010];
int dis[N];
bool st[N];
//朴素版的dijkstra算法
void dijkstra() {
memset(dis, 0x3f, sizeof dis);
dis[1] = 0;
for(int i = 0; i < n; ++ i ) {//n个点n次迭代
int t = -1;
for(int j = 1; j <= n; ++ j ) {//找到最小值
if(st[j] == false && (t == -1 || dis[t] > dis[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 / 2)cout << -1 << endl;
else cout << dis[n] << endl;
}
signed main() {
cin >> n >> m;
memset(g, 0x3f, sizeof g);
for(int i = 1; i <= n; ++ i ) {
g[i][i] = 0;
}
for(int i = 1; i <= m; ++ i ) {
int x, y, v;
cin >> x >> y >> v;
g[x][y] = min(g[x][y], v);//有向图
}
dijkstra();
return 0;
}