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;
}

posted @ 2022-03-10 20:41  沃特艾文儿  阅读(18)  评论(0)    收藏  举报  来源