我采用的是Dijkstra算法,初学,本蒟蒻暂时不会用堆优化,还望大佬勿怪。
#include <cstdio>
#include <cstring>
int min(int a, int b) {
return a < b ? a : b;
}
int n, m, s, g[10005][10005], f[10005];
bool vis[10005];
int main() {
scanf ("%d%d%d", &n, &m, &s);
memset(g, 0x3f3f3f3f, sizeof(g));
for (int i = 1; i <= m; i++) {
int u, v, w;
scanf ("%d%d%d", &u, &v, &w);
g[u][v] = min(g[u][v], w);
}
for (int i = 1; i <= n; i++)
f[i] = g[s][i];
f[s] = 0;
vis[s] = true;
for (int i = 1; i <= n; i++) {
int minn = 0x3f3f3f3f, k = s;
for (int j = 1; j <= n; j++)
if (f[j] < minn && !vis[j]) {
minn = f[j];
k = j;
}
if (k == s)
break;
vis[k] = true;
for (int j = 1; j <= n; j++)
if (!vis[j] && g[k][j] < 0x3f3f3f3f)
if (f[j] > f[k] + g[k][j])
f[j] = f[k] + g[k][j];
}
for (int i = 1; i <= n; i++)
printf ("%d ", f[i]);
return 0;
}
希望大佬指点指点。