#define MAXN 1005
#define INF 0x3f3f3f3f
int G[MAXN][MAXN]; // 邻接矩阵,G[u][v]表示顶点u到顶点v的距离,或者为INF,表示u、v之间不存在边
int n; // 顶点数
int dist[MAXN]; // dist[i]表示顶点i到源点的最短距离,初始时只有源点和与源点直接相邻的点有数值,其他点为INF
int p[MAXN]; // p[i]表示i到源点的最短路径上的前一跳,初始时只有源点和与源点直接相邻的点有数值,其他点为-1
int visited[MAXN]; // 表示顶点i是否已访问过
void dijkstra(int u) { // 计算源点u到其他各点的最短距离
// 初始化
for(int i = 0; i < n; i++) {
visited[i] = false;
dist[i] = G[u][i]; // 初始化源点到其他各顶点的距离,可能为INF
p[i] = (dist[i] == INF ? -1 : u); // 与源点相邻,设置前驱结点为u,不相邻,设置前驱结点为-1
}
// 从源点u开始
dist[u] = 0;
visited[u] = true;
// 对所有顶点进行松弛操作
for(int i = 0; i < n; i++) {
// 找出剩余顶点中离源点最近的点
int tmp = INF, t = u;
for(int j = 0; j < n; j++) {
if(!visited[j] && dist[j] < tmp) {
t = j;
tmp = dist[j];
}
}
if(t == u) return;
visited[t] = true;
for(int j = 0; j < n; j++) { // 更新t的邻接点的最短路径长度,松弛操作
if(G[t][j] != INF && !visited[j] && dist[j] > dist[t] + G[t][j]) {
dist[j] = dist[t] + G[t][j];
p[j] = t;
}
}
}
}