Mejor viaje (Informática Olimpiadas One Pass-T1377)

Descripción del título La
ciudad H es una atracción turística y miles de personas vienen a visitarla cada año.

Para comodidad de los turistas, las empresas de autobuses han establecido paradas de autobús y han abierto algunas líneas de autobús de un solo sentido en varias atracciones turísticas, hoteles, restaurantes y otros lugares.

Cada línea de autobús de ida sale de una determinada parada de autobús, pasa por varias paradas de autobús por turno y finalmente llega a la última parada de autobús.

Un viajero visitó recientemente la ciudad H. Quería visitar S Park, pero si no hay autobús desde el hotel donde se encuentra, puede llegar directamente al S Park.

Luego, puede que tenga que tomar un autobús determinado y hacer algunas paradas, y luego cambiar a otro autobús en la misma plataforma, de modo que llegará a S Park después de cambiar varias veces.

Ahora use el entero 1, 2,… N para numerar todas las paradas de autobús en la ciudad H. Se acuerda que el número de la parada de autobús del hotel donde se encuentra el pasajero es 1 y el número de la parada de autobús S Park es N .

Escriba un programa para ayudar a este pasajero a encontrar un plan de viaje óptimo, de modo que tenga la menor cantidad de cambios durante el viaje desde el hotel hasta S Park.

Formato de entrada
Hay dos números M y N en la primera línea, lo que indica que se han abierto M líneas de bus unidireccionales y hay un total de N estaciones.
Desde la segunda línea hasta la línea M, la información de la 1ª a la Mª línea de bus se da en secuencia, y la línea i + 1 proporciona la información de la i-ésima línea de bus.

De izquierda a derecha, todos los números de estación en la línea se dan en orden de operación, separados por un espacio entre dos números de estación adyacentes.

Formato de salida
Si no puede tomar el autobús desde el hotel a S Park, entonces salida N0; de lo contrario, envíe el número mínimo de cambios encontrados por su programa

Si el número de cambios de coche es 0, significa que se puede acceder al coche sin cambiar de coche.

Ejemplo de entrada
3 7
6 7
4 7 3 6
2 1 3 5

Salida de muestra
2

Rango de datos
1 <N ≤ 500
1 ≤ M ≤ 100


Solución de problemas
dijkstra (versión simple):

解题思路: La dificultad de esta pregunta es leer y crear una imagen;

  1. En primer lugar 换乘次数 = 乘车次数 - 1;
  2. 读入: Como la incertidumbre de cada ruta pasará por varias estaciones, puede stringstreammanejar lectura;
  3. 建图: La muestra 4 7 3 6, por ejemplo, respectivamente 4 ~ 7, 4 ~ 3, 4 ~ 6, 7 ~ 3, 7 ~ 6, 3 ~ 6incluso un peso borde de 1;
  4. Desde representa 车站4hecho 车站7tan largo como un viaje en coche, expresado de 车站4no 车站3sólo tomar un coche ......
#include <iostream>
#include <cstring>
#include <sstream>
using namespace std;

const int N = 510;

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

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

int main()
{
    
    
    cin >> m >> n;
    
    string s;
    getline(cin, s);                                    // 过滤掉回车
    
    memset(g, 0x3f, sizeof g);
    
    while(m --)
    {
    
    
        getline(cin, s);
        stringstream ssin(s);
        
        int cnt = 0, k;
        while(ssin >> k) station[cnt ++] = k;
        
        for (int i = 0; i < cnt; i ++)
            for (int j = i + 1; j < cnt; j ++)
                g[station[i]][station[j]] = 1;          // 从 station[i] 到 station[j] 只要坐一次车
    }
    
    dijkstra();
    
    if(dist[n] == 0x3f3f3f3f) cout << "NO" << endl;
    else cout << dist[n] - 1 << endl;
    
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_46239370/article/details/113820236
Recomendado
Clasificación