既然是模板, 那就直接贴代码?
两种思路
1.迪杰斯特拉
#include <iostream> #include <cstdio> #define N 500005 #define inf 2147483647 using namespace std; int n, m, s, dis[N], cnt, vis[N], head[N]; struct node { int to, next, wei; }tr[N]; void add (int x, int y, int z) { tr[++cnt].to = y; tr[cnt].wei = z; tr[cnt].next = head[x]; head[x] = cnt; } int main () { scanf ("%d%d%d", &m, &n, &s); for (int i = 1; i <= n; i++) dis[i] = inf; dis[s] = 0; for (int i = 1; i <= n; i++) { int a, b, c; scanf ("%d%d%d", &a, &b, &c); add (a, b, c); } int d = s; while (vis[d] == 0) { long long ans = inf; vis[d] = 1; for (int i = head[d]; i ; i = tr[i].next) if (!vis[tr[i].to] && dis[tr[i].to] > dis[d] + tr[i].wei) dis[tr[i].to] = dis[d] + tr[i].wei; for (int i = 1; i <= m; i++) if (dis[i] < ans && vis[i] == 0) { ans = dis[i]; d = i; } } for (int i = 1; i <= m; i++) printf ("%d ",dis[i]); return 0; }
2.spfa
#include <iostream> #include <cstdio> #include <queue> #define N 500005 #define inf 2147483647 using namespace std; int n, m, s, cnt; int dis[N], vis[N], head[N]; struct node { int next, to, w; }tr[N]; void add (int x, int y, int z) { tr[++cnt].to = y; tr[cnt].next = head[x]; tr[cnt].w = z; head[x] = cnt; } void spfa () { queue<int> q; for (int i = 1; i <= n; i++) dis[i] = inf; vis[s] = 1; q.push(s); dis[s] = 0; while (!q.empty()) { int he = q.front(); q.pop(); vis[he] = 0; for (int i = head[he]; i ;i = tr[i].next) { if (dis[tr[i].to] > dis[he] + tr[i].w) { dis[tr[i].to] = dis[he] + tr[i].w; if (!vis[tr[i].to]) { vis[tr[i].to] = 1; q.push(tr[i].to); } } } } } int main () { scanf ("%d%d%d", &n, &m, &s); for (int i = 1; i <= m; i++) { int a, b, c; scanf ("%d%d%d", &a, &b, &c); add (a, b, c); } spfa (); for (int i = 1; i <= n; i++) if (s == i) printf ("0 "); else printf ("%d ", dis[i]); return 0; }