spfa 或者 dijkstra 解决 洛谷 P3905 道路重建
对于已经连接的路距离设为零,断开的道路保持原先的距离跑一遍dijkstra 或者spfa 。
//
// Created by 29273 on 2022-03-01.
//
#include "bits/stdc++.h"
using namespace std;
#define inf 0x3f3f3f
const int maxN = 1e3 + 10;
int n, m, a, b, c, d, g, k, A, B;
int G[maxN][maxN], F[maxN][maxN], dist[maxN], vis[maxN];
void spfa(int root) {
vis[root] = 1;
memset(dist, inf, sizeof dist);
dist[root] = 0;
queue<int> Q;
Q.push(root);
while (Q.size()) {
int top = Q.front();
Q.pop();
for (int i = 1; i <= n; ++i) {
if (dist[i] > dist[top] + G[top][i]) {
dist[i] = dist[top] + G[top][i];
if (!vis[i]) {
Q.push(i);
vis[i] = 1;
}
}
}
}
}
int main() {
cin >> n >> m;
memset(G, inf, sizeof G);
for (int i = 0; i < m; ++i) {
cin >> a >> b >> c;
G[a][b] = 0;
G[b][a] = 0;
F[a][b] = c;
F[b][a] = c;
}
cin >> d;
for (int i = 0; i < d; ++i) {
cin >> g >> k;
G[g][k] = F[g][k];
G[k][g] = F[g][k];
}
cin >> A >> B;
spfa(A);
printf("%d\n",dist[B]);
return 0;
}
#include "bits/stdc++.h"
using namespace std;
#define inf 0x3f3f3f3f
int n, m, t, s, tar, u, v, len, uu;
const int MAXN = 1e2 + 10;
int d[MAXN][MAXN], d1[MAXN][MAXN], dis[MAXN], vis[MAXN], pre[MAXN];
void Dijkstra(int root) {
for (int i = 1; i <= n; i++) {
dis[i] = inf;
vis[i] = false;
pre[i] = -1;
}
dis[root] = 0;
uu = root;
for (int j = 0; j < n; j++) {
int k = -1;
int Min = inf;
for (int i = 1; i <= n; i++)
if (!vis[i] && dis[i] < Min) {
Min = dis[i];
k = i;
}
pre[k] = uu;
if (k == tar) return;
if (k == -1)break;
vis[k] = true;
for (int i = 1; i <= n; i++)
if (!vis[i] && dis[k] + d1[k][i] < dis[i]) {
dis[i] = dis[k] + d1[k][i];
}
uu = k;
}
}
void print(int ta) {
if (ta == -1) return;
print(pre[ta]);
cout << " " << ta;
}
int main() {
cin >> n;
cin >> m;
memset(d1, inf, sizeof d1);
while (m--) {
cin >> u >> v >> len;
d[u][v] = len;
d[v][u] = len;
d1[u][v] = 0;
d1[v][u] = 0;
}
cin >> t;
while (t--) {
cin >> u >> v;
d1[u][v] = d[u][v];
d1[v][u] = d[u][v];
}
cin >> s >> tar;
Dijkstra(s);
// for (int i = 1; i <= n; ++i) {
// cout << pre[i] << " ";
// }
cout << dis[tar] << endl;
// print(tar);
return 0;
}

浙公网安备 33010602011771号