标签:sizeof 初始化 a算法 下标 jks 优化 最短路径 pac dijkstra
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
//数组g为邻接矩阵用于存放权值, 数组dis[i]表示起点到节点i的距离, n代表点的个数, m代表边的个数
int g[N][N], dis[N], n, m;                              
bool v[N];                                              //数组v用于标记起点到当前节点的最短路径是否已经确定
void dijkstra() {
    memset(dis, 0x3f, sizeof dis);                      //初始化起点到各个点的距离为 +∞
    memset(v, 0, sizeof v);                             //初始化起点到各个点的最短距离为未确定状态
    dis[1] = 0;                                         //起点到起点的距离设为0
    for (int i = 1; i < n; i++) {
        int x = 0;                                      //x表示起点到当前节点为最短距离的那个节点的下标
        //找到未标记节点中dis最小的
        for (int j = 1; j <= n; j++)
            if (!v[j] && (x == 0 || dis[j] < dis[x]))   //节点j未标记并且起点到节点j的距离比到节点x的距离短
                x = j;                                  //更新一下代表最短路径的节点下标
        v[x] = 1;                                       //起点到当前的节点x的距离必定最短了, 所以可以标记节点x了
        for (int y = 1; y <= n; y++)                    //这次是遍历节点x的所有出边即x-->y 
            dis[y] = min(dis[y], dis[x] + g[x][y]);     //由于起点到节点x的最短距离已经确定, 那么起点到节点y的距离根据左式更新一下就ok
    }
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    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, z;
        cin >> x >> y >> z;
        g[x][y] = min(g[x][y], z);                      //构建邻接矩阵
    }
    dijkstra();
    //这部分内容根据题意自己写
    return 0;
}
标签:sizeof 初始化 a算法 下标 jks 优化 最短路径 pac dijkstra
原文地址:https://www.cnblogs.com/xiezeju/p/14459052.html