hdu2066 viaje de una persona (multi-multi-punto final inicia Floyd algoritmo)

Descripción del problema
Aunque la hierba es Luchi (es decir, Hangzhou eléctrica pasó más de un año, en realidad perderse en los campus, Khan ~), pero la hierba es todavía muy aficionado a viajar, porque el camino se encontrará con un montón de gente (Whitehorse Prince), un montón de cosas, sino también para enriquecer su experiencia, también se puede ver el hermoso paisaje ...... la hierba ir un montón de lugares que quería ir a la torre de Tokio para ver en la noche, fue a Venecia para ver la película, ir a ver Yangmingshan cala, nueva York puramente para ver la nieve, ir a París para escribir una taza de café, fue a Beijing para visitar un hada ...... ver se acerca el invierno, por lo que un gran periodo de tiempo, no puede permitirse el lujo de perder ah, debe darse una buena unas vacaciones, pero no puede ser abandonada la formación de ah, por lo que la hierba se decidió a ir a un lugar que quieren ser en el menor tiempo posible! Debido a que la familia de las gramíneas en una ciudad pequeña, sin tren pasó, para que pueda ir a las ciudades vecinas en tren (bien pobres ah ~).

De entrada
de entrada varios conjuntos de datos, la primera línea de cada uno de los tres enteros T, S y D, carretera T expresado, y no hay hierba casa adyacente a la ciudad de S, D hierba quieren ir allí uno;
luego con un T-fila, cada fila tiene tres números enteros a, b, tiempo, representa un coche entre a, b son las horas de tiempo de la ciudad; (1 <= (a, b) <= 1,000; puede ser de entre a, b múltiples rutas)
seguido de la primera fila tiene el número de T + 1 S, y representa ciudad familia de las gramíneas conectado;
a continuación, la segunda fila tiene el número de T + 2 D, representa un lugar a donde ir hierba.

Salida
Salida el tiempo mínimo para ir a la hierba como una ciudad.

Ejemplo de entrada
6 2 3
1 3 5
1 4 7
2 8 12
3 8 4
4 9 12
9 10 2
1 2
8 9 10

Salida de muestra en
9

Esta pregunta es en realidad un problema del camino, y el camino para resolver el problema de dos maneras, una es el método Dykstra, que puede ponerlo como punto de partida de un fijo a una distancia fija desde el final, y el segundo es el algoritmo de Floyd, creo que es la distancia entre un punto de partida desde múltiples a extremo múltiple. Se puede considerar como una especie de dinámica programándolo!

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
//弗洛伊德算法,也就是一种任意两点之间的距离,而这道题,我们可以初始化,所有的点的距离是max,也就是一个最大的值
//然后输入一些对应的点
//再使用动态规划的求出每两点之间的距离
//再求出从起点到终点之间的距离
struct S{
    int from,to,dis;//起点,终点,和距离
}way[100];
int main(){
    int t,s,d;//t条路,s个相邻的点,d个想去的点
    int i,j,k;
    int L[100][100];
    int qidian[100];
    int zhongdian[100];
    int  mmin=1000;
    //创建一个数组来存所有可能性的距离,并把他们初始化为最大值
    for(i=1;i<100;i++)
        for(j=1;j<100;j++){
            if(i==j)
               L[i][j]=0;
               else
                    L[i][j]=1000;//初始化一个最大的值
        }
    //然后开始输入第一行的东西
    scanf("%d%d%d",&t,&s,&d);
    for(i=0;i<t;i++){
            //存对应的距离
        scanf("%d%d%d",&way[i].from,&way[i].to,&way[i].dis);
        L[way[i].from][way[i].to]=way[i].dis;
    }
    //然后是起点
    for(i=0;i<s;i++)
        scanf("%d",&qidian[i]);
    //然后是终点
    for(i=0;i<d;i++)
        scanf("%d",&zhongdian[i]);
    //然后开始求各自的距离,动态规划
    for(k=1;k<100;k++)
    for(i=1;i<100;i++)
    for(j=1;j<100;j++){//动态规划,要么选k,要么不选k
        L[i][j]=min(L[i][j],(L[i][k]+L[k][j]));
    }
    //然后再开始求从起点到终点的距离
    for(i=0;i<s;i++)
        for(j=0;j<d;j++)
    {
        if(L[qidian[i]][zhongdian[j]]<mmin)
            mmin=L[qidian[i]][zhongdian[j]];
    }
    printf("%d",mmin);

}

Publicado 72 artículos originales · ganado elogios 5 · Vistas 2801

Supongo que te gusta

Origin blog.csdn.net/qq_41115379/article/details/104987430
Recomendado
Clasificación