#Dijkstra ——Acwing 849. Dijkstra求最短路 I

#include<bits/stdc++.h>
using namespace std;
int a[510][510], n, m, d[510];
bool v[510];
const int N = 1000010;
void dijkstra() {
    d[1] = 0;
    for(int i = 1; i < n; i++){ // n - 1次
        int x = 0;
        for(int j = 1; j <= n; j++)// 找到 d值(距离1号最近的) 最小的
        	if(!v[j] && (x == 0 || d[j] < d[x])) x = j;
        v[x] = 1; 
        for(int y = 1; y <= n; y++)// 用 最小的点 来更新 d值 
        	d[y] = min(d[y], d[x] + a[x][y]);
    }
}
int main(){
    memset(a, '0', sizeof(a));
    memset(d, 1, sizeof(d));// 距离 1号 的距离
    memset(v, 0, sizeof(v));// 标记节点
    for(int i = 1; i <= n; i++)
        a[i][i] = 0;
    cin >> n >> m;
    for (int i = 1; i <= m; i ++){
        int x, y, z;
        cin >> x >> y >> z;
        a[x][y] = min(a[x][y], z);
    }
    dijkstra();
    
    	if(d[n] == 16843009)//这里数组初始化用memset 写 1 时赋的值是这个数。
    		cout << "-1";
    	else
    		 cout << d[n] << endl;
    return 0;
}
原文地址:https://www.cnblogs.com/yuanyulin/p/14026773.html