Dote cara (camino más corto, dibujo)

Título

Hay varios artículos, estos artículos tienen un precio y el nivel del propietario (el nivel más alto del punto objetivo), y luego habrá varias alternativas y precios con descuento. Cada artículo solo se puede comprar con uno de sus sustitutos como máximo. Al intercambiar, existe un límite superior en la diferencia de nivel de todos los propietarios que participan en el intercambio. Pregunte, ¿cuánto dinero se requiere para cambiar por el artículo objetivo?

práctica

Considere la posibilidad de construir un mapa como este. El sustituto de cada artículo se puede conectar a un borde dirigido que conduce al artículo, y el borde derecho es el precio con descuento. Y establezca un punto de origen virtual, conectado a todos los artículos, los derechos fronterizos son los precios de estos artículos. El problema se transforma en la ruta más corta desde el punto de origen virtual al punto de destino. A continuación, considere la limitación de la diferencia de nivel. Debido a que se ha determinado el nivel del punto objetivo, puede atravesar el límite inferior que cumple con los requisitos, encontrar la ruta más corta para cada intervalo de nivel y luego encontrar el mínimo. En el proceso de encontrar la ruta más corta, solo se pueden actualizar los puntos dentro del rango del nivel y los puntos que no están dentro del rango no se pueden actualizar.

Código

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int N = 110, inf = 0x3f3f3f3f;

int n,m,k;
int g[N][N];
int rk[N], dist[N];
bool st[N];

int dijkstra(int down, int up)
{
    
    
    memset(dist,0x3f,sizeof(dist));
    memset(st,false,sizeof(st));
    dist[0] = 0;
    for(int i=0;i<=n;i++){
    
    
        int t = -1;
        for(int j=0;j<=n;j++){
    
    
            if(!st[j]&&(t==-1||dist[t]>dist[j])){
    
    
                t = j;
            }
        }
        st[t] = true;
        for(int j=1;j<=n;j++){
    
    
            if(rk[j]>=down&&rk[j]<=up){
    
    
                dist[j] = min(dist[j], dist[t]+g[t][j]);
            }
        }
    }
    return dist[1];
}

int main()
{
    
    
    cin >> k >> n;
    memset(g,0x3f,sizeof(g));
    for(int i=1;i<=n;i++) g[i][i] = 0;
    for(int i=1;i<=n;i++){
    
    
        int price, level, cnt;
        cin >> price >> level >> cnt;
        rk[i] = level;
        g[0][i] = min(g[0][i], price);
        for(int j=0;j<cnt;j++){
    
    
            int id, c;
            cin >> id >> c;
            g[id][i] = min(g[id][i], c);
        }
    }
    int res = inf;
    for(int i=rk[1]-k;i<=rk[1];i++) res = min(res, dijkstra(i, i+k));
    cout << res << endl;
    return 0;
}

recompensa

Esta pregunta introduce una restricción: esta restricción tiene un atributo, cada punto tiene un valor y existe un límite superior para la diferencia de atributos entre todos los puntos de la ruta. Este tipo de problema consiste en enumerar todos los intervalos que cumplen con este límite y encontrar la ruta más corta en cada intervalo. Esto es diferente del problema del camino más corto bidimensional El problema del camino más corto bidimensional tiene dos pesos laterales, un peso lateral busca el camino más corto y el otro lado tiene una longitud de camino que satisface una restricción. El problema del camino más corto bidimensional se describirá en detalle más adelante.

Supongo que te gusta

Origin blog.csdn.net/weixin_43634220/article/details/108604225
Recomendado
Clasificación