题解 | #【模板】单源最短路2#
【模板】单源最短路2
https://www.nowcoder.com/practice/7c1740c3d4ba4b3486df4847ee6e8fc7
个人认为比较标准的邻接矩阵Dij写法,仅供参考
#include <bits/stdc++.h>
#define INF 0x7fffffff
using namespace std;
int G[5050][5050];
int dis[5050]; //min dis from s to []
bool vis[5050] = {false};
void dij(int s, int n) {
int i = 1, j = 1;
fill(dis, dis + 5050, INF);
dis[s] = 0;
for (i = 1; i <= 5050; i++) { //我服,是遍历所有5000个点不是n个,否则后面几组出问题
int u = -1, MIN = INF;
for (j = 1; j <= 5050; j++) {
if (vis[j] == false && dis[j] < MIN) {
u = j;
MIN = dis[j];
}
}
if (u == -1) return;
vis[u] = true;
for (int v = 1; v <= 5050; v++) {
if (vis[v] == false && G[u][v] != INF && dis[u] + G[u][v] < dis[v]) {
dis[v] = dis[u] + G[u][v];
}
}
}
}
int main() {
int m, n;
cin >> n >> m;
fill(G[0], G[0] + 5050 * 5050, INF);
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
G[u][v] = w;
G[v][u] = w;
}
dij(1, n);
//for(int i=0;i<n;i++) cout<<dis[i]<<" ";
if (dis[n] != INF) cout << dis[n] << endl;
else cout << "-1" << endl;
system("pause");
return 0;
}
