标签: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