关键点:
-
初始化
fill(dis, dis + 510, inf);
fill(e[0], e[0] + 510 * 510, inf);
dis[起始点] = 0;
同时要考虑一些其他要更新的数组全局和起始点初始化 -
二重循环——内部u,v两个版块大循环
for(int i = 0; i < n; i++) {
int u = -1, minn = inf;
for(int j = 0; j < n; j++) { // u 版块
if(visit[j] == false && dis[j] < minn) {
u = j;
minn = dis[j];
}
}
if(u == -1) break;
visit[u] = true;
for(int v = 0; v < n; v++) { // v 版块
if(visit[v] == false && e[u][v] != inf) {
if(e[u][v] + dis[u] < dis[v]) { //有最短路径时咋更新
dis[v] = e[u][v] + dis[u];
dispre[v] = u;
weight[v] = weight[u] + w[u][v];
} else if(e[u][v] + dis[u] == dis[v] && weight[v] > weight[u]
+ w[u][v]) {
weight[v] = weight[u] + w[u][v]; //有两条最短路径时更新什么
dispre[v] = u;
}
}
}
}