(Jizhong) 1595. [Formación] GDKOI peajes (peaje)] [Floyed

(Archivo IO): Entrada: toll.in toll.out: salida de
límite de tiempo: 1000 ms limitaciones de espacio: las restricciones específicas 262144 KB
Goto Boletín de problemas


Título Descripción
con todos los demás, Farmer John prefiere enseñarme negativo al mundo de ganado, el mundo de ganado sacarlo de la espíritu negativo de mi gran día y noche tratando de encontrar manera de hacer dinero. Con el fin de hacer una fortuna, estableció una serie de reglas y regulaciones para que cualquier vaca caminando en un camino agrícola peajes deben ser entregados a Farmer John.

Granja de N (1 <= N <= 250) prado (numerados 1 a N), y tiene un M (1 <= M <= 10000) bi-direccional enlace por carretera hierba A_j y B_j (1 <= A_j <= N; 1 <= B_j <= N). Las vacas pueden llegar a cualquier salida de cualquiera de una pradera cubierta de hierba. FJ ha proporcionado una carretera de peaje está conectado a través de una bidireccional L_j A_j y B_j de (1 <= L_j <= 100.000).

Número posible de carreteras que conectan los dos mismos prados, pero no hay una carretera que conecta una pradera de hierba y esto en sí. La buena noticia es que la mayoría de las vacas de cualquiera de un césped, a través de una serie de caminos, siempre se puede llegar a cualquier otro de un prado.

Además de la codicia, no sabemos qué decir. FJ incluso en cada uno de los anteriores está también provisto de un prado peajes C_i (1 <= C_i <= 100.000). A partir de una pradera cubierta de hierba a otra pieza del costo, es el resultado de todos los peajes y los peajes máximos, además de todas paso la hierba (incluyendo inicio y final) de.

Ganado de trabajo duros que quieren investigar lo que se debe elegir ese camino. Ellos quieren que escriba un programa que acepte K (1 <= k <= 10.000) problema y el coste mínimo por salida correspondiente al desafío. El i-ésimo cuestión comprende dos números y S_I t_i (1 <= S_I <= N; 1 <= t_i <= N ;! S_i = t_i), que muestra el comienzo y al final del césped.

Observa el siguiente gráfico muestra que comprende cinco hierba:
Aquí Insertar imagen Descripción
desde una carretera a un lado de la pradera de césped 3 'de los peajes '3', el punto de peaje "pastizales 2 a 5.

1 provienen del césped de hierba 4, puede venir del césped de hierba 13 y luego fueron al césped de hierba 4 5 finalmente llegó. Si es así ir, la necesidad "peajes laterales" es 2 + 1 + 1 = 4, puntos necesitan peajes 4 (punto de hierba 5 peajes máximo), por lo que el costo total es 4 + 4 = 8.

La mejor ruta es de 2 a 3 césped del césped 2, 5 llegaron a la hierba, hierba y finalmente a 3. Así que, los peajes para el borde 3 + 1 = 4, 5 puntos - el peaje es un costo total de 5 + 4 = 9.


Entrada
Línea 1: tres espacios separados números enteros: N, M y K
segundos a través de N + 1 línea: primero i línea + 1 contiene un único número entero: C_i
de la primera N + 2 a N + M + 1 : línea j + N + 1 línea contiene tres enteros separados por espacios: A_j, B_j L_j y
la primera N + M + 2 invertida primera N + M + K + 1: línea i + N + M + 1 filas denota el i-ésimo cuestión comprende dos espacios separados por un número entero y t_i S_I

Salidas
de la primera a la línea K: la i-ésima fila contiene un solo número entero, que representa el costo mínimo para S_I de la t_i.


entrada de la muestra
. 5. 7 2
2
. 5
. 3
. 3
. 4
. 1 2. 3
. 1. 3 2
2. 5. 3
. 5. 3. 1
. 5. 1. 4
2. 4. 3
. 3. 4. 4
. 1. 4
2. 3

Ejemplo de salida
. 8
. 9


límite de rango de datos


Ideas para resolver problemas
de múltiples fuentes problema del camino más corto, una pequeña cantidad de datos, es evidente que se puede utilizar F l la y re Floyd algoritmo para proceso,
ya que el camino más corto se refiere al punto máximo en el camino correcto, por lo que la rapidez etapa de decisión de transición de estado, los resultados en el punto de máxima peso camino es la consideración principal de esta pregunta. Si todo el derecho a enumerar punto, la complejidad es claramente explosión.
Recordamos nuevamente nuevo F l la y re Floyd algoritmo funciona:
i a j, hay dos posibilidades: a directamente y por medio de las interfaces intermedias k k , tiene una metro yo norte me en la línea
que queremos ver más abajo delgado, k k representa el medio de la interfaz, y k k orden de enumeración es arbitraria?
Manifiestamente arbitraria! Un gran avance en esto: que podemos modificar la desenfrenada k k orden de enumeración! Por lo tanto, se resuelve esta cuestión.
Nos aprovechamos pesos desde pequeñas a grandes renumeración, que es un punto de tránsito k k representantes es el punto a numerar, k k mayor, cuanto mayor sea el punto correcto
sólo tenemos que enumerar pequeño a grande punto de tránsito k k , porque el k k es la enumeración de pequeño a grande
que estamos buscando yo , j i, j camino más corto entre, punto de tránsito que, aunque sólo sea para enumerar k k , lo que explica nuestra actual yo , j i, j corta entre el derecho a un poco más de k k gran lugar poco derecha de la pagina k k es decir, como yo - > j i-> j Además de la ruta yo , j i, j punto correcto exterior máximo,
y luego para ejecutar lata F l y la re flyod punto máximo en el camino es el derecho yo , j , k i, j, k tres puntos a la derecha del punto medio del valor máximo!


código

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<iomanip>
#include<cmath>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,K,b[260],p,q,dis[260][260],ans[260][260];
struct c{
    int x,y;
}a[260];
bool cmp(const c&l,const c&r){
    return l.x<r.x;
}
int main(){
   freopen("toll.in","r",stdin);
   freopen("toll.out","w",stdout);
    scanf("%d%d%d",&n,&m,&K);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i].x);
        a[i].y=i;
    }
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
        b[a[i].y]=i;
    memset(dis,INF,sizeof(dis));
    for(int i=1;i<=n;i++)
        dis[i][i]=0;
    for(int i=1;i<=m;i++)
    {
        int u,v,w;
        scanf("%d%d%d",&u,&v,&w);
        dis[b[u]][b[v]]=dis[b[v]][b[u]]=min(dis[b[u]][b[v]],w);
    }
    memset(ans,INF,sizeof(ans));
    for(int k=1;k<=n;k++)
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
            {
                if(i==j)
                 continue;
               dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
              if(dis[i][j]==dis[i][k]+dis[k][j])
                    ans[i][j]=min(ans[i][j],dis[i][j]+max(a[i].x,max(a[j].x,a[k].x)));
                    
            }
    for(int i=1;i<=K;i++)
    {
         scanf("%d%d",&p,&q);
         printf("%d\n",ans[b[p]][b[q]]);
    }
}
Publicados 119 artículos originales · ganado elogios 8 · vistas 4910

Supongo que te gusta

Origin blog.csdn.net/kejin2019/article/details/104978499
Recomendado
Clasificación