codeforces1473E Minimum Path (spfa deformation)

Portal
If just the first 111 point respectively to theiithe minimum value of i points, then rundij dijdirectlyd i j , but this question adds the maximum value and the minimum value added to the path, then considerd [i] [0/1] [0/1] d[i][0/1][0/ 1]D [ I ] [ 0 / . 1 ] [ 0 / . 1 ] are represented from111 point toiiIf the i points do not subtract the maximum value / have subtracted the maximum value and have not subtracted the minimum value / have subtracted the minimum path of the minimum path, then the final answer must be eachd [i] [1] [1] d[i] [1][1]d [ i ] [ 1 ] [ 1 ] , the last wave of analysis
d [v] [0] [0] = min (d [u] [0] [0] + w, d [v] [0] [0]) d [v] [1] [0] = min ( d [u] [0] [0], d [v] [1] [0]) d [v] [1] [0] = min (d [u] [1] [0] + w, d [ v] [1] [0] d [v] [0] [1] = min (d [u] [0] [0] + 2 ∗ w, d [v] [0] [1]) d [v ] [0] [1] = min (d [u] [0] [1] + w, d [v] [0] [1]) d [v] [1] [1] = min (d [u ] [0] [0] + w, d [v] [1] [1]) d [v] [1] [1] = min (d [u] [1] [0] + 2 ∗ w, d [v] [1] [1]) d [v] [1] [1] = min (d [u] [0] [1], d [1] [1] [1]) d [v] [ 1] [1] = min (d [u] [1] [1] + w, d [v] [1] [1]) d [v] [0] [0] = min (d [u] [ 0] [0]+w, d [v] [0] [0]) \\ d [v] [1] [0] = min (d [u] [0] [0], d [v] [ 1] [0]) \\ d [v] [1] [0] = min (d [u] [1] [0]+w, d [v] [1] [0] \\ d [v] [0] [1] = min (d [u] [0] [0]+2*w,d [v] [0] [1]) \\ d [v] [0] [1] = min (d [u] [0] [1]+w, d [v] [0] [1]) \\ d [v] [1] [1] = min (d [u] [0] [0]+w, d [v] [1] [1]) \\ d [v] [1] [1 ] = min (d [u] [1] [0]+2*w, d [v] [1] [1]) \\ d [v] [1] [1] = min (d [u] [ 0] [1], d [1] [1] [1]) \\ d [v] [1] [1] = min (d [u] [1] [1]+w, d [v] [ 1] [1])d[v][0][0]=m and n ( d [ u ] [ 0 ] [ 0 ]+w,d[v][0][0])d[v][1][0]=m and n ( d [ u ] [ 0 ] [ 0 ] ,d[v][1][0])d[v][1][0]=m and n ( d [ u ] [ 1 ] [ 0 ]+w,d[v][1][0]d[v][0][1]=m and n ( d [ u ] [ 0 ] [ 0 ]+2w,d[v][0][1])d[v][0][1]=m and n ( d [ u ] [ 0 ] [ 1 ]+w,d[v][0][1])d[v][1][1]=m and n ( d [ u ] [ 0 ] [ 0 ]+w,d[v][1][1])d[v][1][1]=m and n ( d [ u ] [ 1 ] [ 0 ]+2w,d[v][1][1])d[v][1][1]=m and n ( d [ u ] [ 0 ] [ 1 ] ,d[1][1][1])d[v][1][1]=m and n ( d [ u ] [ 1 ] [ 1 ]+w,d [ v ] [ 1 ] [ 1 ] )
Then just continue to run spfa update (refer to the official solution)

Ready to change the code specification, the space must be space, after all, the code is for others to see

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 5;
int n, m, u, v, w;
long long d[N][2][2];
vector<pair<int, int>> g[N];
int main()
{
    
    
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
    
    
        cin >> u >> v >> w;
        u--; v--;
        g[u].emplace_back(v, w);
        g[v].emplace_back(u, w);
    }
    for (int i = 0; i < n; i++) {
    
    
        for(int j = 0; j < 2; j++) {
    
    
            for(int k = 0; k < 2; k++) {
    
    
                d[i][j][k] = (long long)1e18;
            }
        }
    }
    d[0][0][0] = 0;
    set<pair<long long, array<int, 3>>> q;
    q.insert({
    
    0, {
    
    0, 0, 0}});
    while (!q.empty()) {
    
    
        auto [u, mx, mn] = q.begin()->second;
        q.erase(q.begin());
        for (auto [v, w] : g[u]) {
    
    
            for (int i = 0; i <= 1 - mx; i++) {
    
    
                for (int j = 0; j <= 1 - mn; j++) {
    
    
                    if (d[v][i | mx][j | mn] > d[u][mx][mn] + (1 - i + j) * w) {
    
    
                        auto it = q.find({
    
    d[v][i | mx][j | mn], {
    
    v, i | mx, j | mn}});
                        if (it != q.end()) {
    
    
                            q.erase(it);
                        }
                        d[v][i | mx][j | mn] = d[u][mx][mn] + (1 - i + j) * w;
                        q.insert({
    
    d[v][i | mx][j | mn], {
    
    v, i | mx, j | mn}});
                    }
                }
            }
        }
    }
    for (int i = 1; i < n; i++) {
    
    
        cout << d[i][1][1] << " ";
    }
    return 0;
}

Guess you like

Origin blog.csdn.net/zhouzi2018/article/details/112733814