题目链接请戳 这里
解题思路
用Dijkstra和SPFA算法解决。
这次还是SPFA快,快了10ms
代码
首先是Dijkstra的
#include<stdio.h> #include<string.h> #include<queue> #include<vector> #define M 100010 #define N 20010 #define INF 1e9 using namespace std; typedef pair<int, int> pii; int v[M], u[M], w[M], first[N], nex[M]; priority_queue <pii, vector<pii>, greater<pii> > q; int n, m, s, t, edge_num; int d[N]; void addedge(int x, int y, int z) { int &e = edge_num; u[e] = x; v[e] = y; w[e] = z; nex[e] = first[u[e]]; first[u[e]] = e; e++; u[e] = y; v[e] = x; w[e] = z; nex[e] = first[u[e]]; first[u[e]] = e; e++; } int Dijkstra(int a, int b) { for (int i = 0; i < n; i++) d[i] = (i == a) ? 0 : INF; q.push(make_pair(d[a], a)); while (!q.empty()) { pii u = q.top(); q.pop(); int x = u.second; if (d[x] != u.first) continue; for (int e = first[x]; e != -1; e = nex[e]) if (d[v[e]] > d[x] + w[e]) { d[v[e]] = d[x] + w[e]; q.push(make_pair(d[v[e]], v[e])); } } return d[b]; } int main() { int tests; int d = 0; scanf("%d", &tests); while (tests--) { d++; edge_num = 0; memset(first, -1, sizeof(first)); scanf("%d%d%d%d", &n, &m, &s, &t); for (int i = 0; i < m; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); addedge(x, y, z); } printf("Case #%d: ", d); int ans = Dijkstra(s, t); if (ans == INF) printf("unreachable\n"); else printf("%d\n", ans); } return 0; }
然后是SPFA的代码
#include<stdio.h> #include<string.h> #include<queue> #include<vector> #define M 100010 #define N 20010 #define INF 1e9 using namespace std; int v[M], u[M], w[M], first[N], nex[M]; queue <int> q; int n, m, s, t, edge_num; int d[N], inq[N]; void addedge(int x, int y, int z) { int &e = edge_num; u[e] = x; v[e] = y; w[e] = z; nex[e] = first[u[e]]; first[u[e]] = e; e++; u[e] = y; v[e] = x; w[e] = z; nex[e] = first[u[e]]; first[u[e]] = e; e++; } int SPFA(int a, int b) { for (int i = 0; i < n; i++) d[i] = (i == a) ? 0 : INF; memset(inq, 0, sizeof(inq)); q.push(a); inq[a] = true; while (!q.empty()) { int x = q.front(); q.pop(); inq[x] = false; for (int e = first[x]; e != -1; e = nex[e]) if (d[v[e]] > d[x] + w[e]) { d[v[e]] = d[x] + w[e]; if (!inq[v[e]]) { inq[v[e]] = true; q.push(v[e]); } } } return d[b]; } int main() { int tests; int d = 0; scanf("%d", &tests); while (tests--) { d++; edge_num = 0; memset(first, -1, sizeof(first)); scanf("%d%d%d%d", &n, &m, &s, &t); for (int i = 0; i < m; i++) { int x, y, z; scanf("%d%d%d", &x, &y, &z); addedge(x, y, z); } printf("Case #%d: ", d); int ans = SPFA(s, t); if (ans == INF) printf("unreachable\n"); else printf("%d\n", ans); } return 0; }