Codeforces 938D: Compre una fuente virtual de ticket + ruta más corta

Portal

Descripción del Título

Ahora hay n cines.
Hay m caminos entre estos n cines, formando un gráfico no dirigido.
El precio de ver películas en cada cine es diferente.
El peaje de cada carretera también es diferente.
Ahora quiero que encuentres el valor mínimo de cada sala de cine.

análisis

El rango de datos de este tema implica que solo puede ejecutar la ruta más corta una vez, o la ruta más corta de optimización del montón.

La ruta de cada respuesta es de un punto a otro, más todos los pesos de los bordes, más el peso de un punto, por lo que podemos encontrar una manera de convertir este peso de puntos en un peso lateral, por
lo que vamos a crear una fuente virtual Apunte, conecte un borde a cada punto, el peso del borde es el peso del punto, y luego puede construir el gráfico de acuerdo con el borde dado.
Debido a que necesita ir hacia adelante y hacia atrás, necesita dos veces

Código

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <cstring>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define _CRT_SECURE_NO_WARNINGS
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline")
#pragma GCC option("arch=native","tune=native","no-zero-upper")
#pragma GCC target("avx2")
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<ll,int> PII;
const int INF = 0x3f3f3f3f;
const int N = 4e5 + 10,M = N * 2;
int h[N],ne[M],e[M],idx;
ll w[M];
ll d[N];
bool st[N];
int n,m;

void add(int x,int y,ll z){
    
    
    ne[idx] = h[x],e[idx] = y,w[idx] = z,h[x] = idx++;
}

void dij(){
    
    
    d[0] = 0;
    priority_queue<PII,vector<PII>,greater<PII> > Q;
    Q.push(PII(0,0));
    while(Q.size()){
    
    
        PII p = Q.top();
        Q.pop();
        int t = p.second;
        if(st[t]) continue;
        st[t] = true;
        for(int i = h[t];i != -1;i = ne[i]){
    
    
            int j = e[i];
            if(d[j] > d[t] + w[i]){
    
    
                d[j] = d[t] + w[i];
                Q.push(PII(d[j],j));
            }
        }
    }
}

int main(){
    
    
    scanf("%d%d",&n,&m);
    for(int i = 0;i <= n;i++) h[i] = -1,d[i] = 0x3f3f3f3f3f3f;
    while(m--){
    
    
        int x,y;
        ll z;
        scanf("%d%d%lld",&x,&y,&z);
        add(x,y,2 * z),add(y,x,2 * z);
    }
    for(int i = 1;i <= n;i++){
    
    
        ll z;
        scanf("%lld",&z);
        add(0,i,z);
    }
    dij();
    for(int i = 1;i <= n;i++) printf("%lld ",d[i]);
    return 0;
}

/**
*  ┏┓   ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃       ┃
* ┃   ━   ┃ ++ + + +
*  ████━████+
*  ◥██◤ ◥██◤ +
* ┃   ┻   ┃
* ┃       ┃ + +
* ┗━┓   ┏━┛
*   ┃   ┃ + + + +Code is far away from  
*   ┃   ┃ + bug with the animal protecting
*   ┃    ┗━━━┓ 神兽保佑,代码无bug 
*   ┃        ┣┓
*    ┃        ┏┛
*     ┗┓┓┏━┳┓┏┛ + + + +
*    ┃┫┫ ┃┫┫
*    ┗┻┛ ┗┻┛+ + + +
*/

Supongo que te gusta

Origin blog.csdn.net/tlyzxc/article/details/112534523
Recomendado
Clasificación