PAT Nivel A 1150 Problema del vendedor viajero

Enlace al título original

El "Problema del viajante de comercio" es la pregunta: "Dada una lista de ciudades y la distancia entre cada par de ciudades, ¿cuál es la ruta más corta para visitar cada ciudad y regresar a la ciudad original?"

Este es un problema NP-difícil en la optimización combinatoria y es de gran importancia en la investigación de operaciones y la informática teórica.

En este problema, se le pide que encuentre el camino más cercano a la solución del problema del viajante de comercio de una lista dada de caminos.

Formato de entrada
La primera línea contiene dos números enteros N y M, que representan el número de ciudades y el número de aristas en el gráfico no dirigido, respectivamente.

Siguientes M líneas, cada línea describe un borde en el formato de City1 City2 Dist, donde los números de la ciudad van del 1 al N, y Dist es positivo y no excede 100.

La siguiente línea contiene un número entero K que representa el número de caminos dados.

Las siguientes líneas K describen la ruta en el formato:

n C1 C2 … Cn
n representa el número de ciudades por las que pasa una determinada ruta, y Ci es el número de ciudades por las que pasa la ruta.

Formato de salida
Para cada ruta, genere Ruta X: TotalDist (Descripción) en una línea.

donde X es el número de ruta (que comienza en 1), TotalDist es la distancia total de la ruta (o NA si la distancia no existe) y Descripción es una de las siguientes:

TS ciclo simple, si es un ciclo simple visitando todas las ciudades.
Ciclo TS, si es un ciclo que visita todas las ciudades, pero no un ciclo simple.
No es un ciclo TS, si este no es un ciclo que visitó todas las ciudades.
La última línea, salida Shortest Dist(X) = TotalDist, donde X es el número de circuito más cercano a la solución del problema del viajante de comercio, y TotalDist es su distancia total.

Garantizado para tener una solución única.

Rango de datos
2<N≤200,
N−1≤M≤N(N−1)2,
1≤K≤1000,
1≤n≤300
Ejemplo de entrada:
6 10
6 2 1
3 4 1 1
5 1
2 5 1
3 1 8
4 1 6 1 6
1 6 3
1 1 2 1 4 5 1 7 7 5 1 4 3 6 2 5 7 6 1 3 4 5 2 6 6 5 1 4 3 6 2 9 6 2 1 6 3 4 5 2 6 4 1 2 5 1 7 6 1 2 5 4 3 1 7 6 3 2 5 4 1 6 Ejemplo de salida: Ruta 1: 11 (TS ciclo simple) Ruta 2: 13 (TS ciclo simple) Ruta 3: 10 (No es un Ciclo TS) Ruta 4: 8 (ciclo TS) Ruta 5: 3 (No es un ciclo TS) Ruta 6: 13 (No es un ciclo TS) Ruta 7: NA (No es un ciclo TS)


















Distancia más corta (4) = 8

Mi solución:

#include <bits/stdc++.h>
using namespace std;
const int N = 210, INF = 0x3f3f3f3f;
int n, m, k;
int d[N][N], vi[310];
bool st[N];
int main(){
    int min_dist = INF;
    int min_id;
    cin >> n >> m;
    memset(d, 0x3f, sizeof d);
    for(int i = 0; i < m; i ++ ){
        int a, b, c;
        cin >> a >> b >> c;
        d[a][b] = d[b][a] = c; 
    }
    cin >> k;
    for(int T = 1; T <= k; T ++ ){
        int sum = 0;
        bool success = true;
        int v;
        cin >> v;
        memset(st, 0, sizeof st);
        for(int i = 1; i <= v; i ++ ) cin >> vi[i];
        for(int i = 1; i + 1 <= v; i ++ ){
            int a = vi[i], b = vi[i + 1];
            if(d[a][b] == INF){
                sum = -1;
                success = false;
                break;
            }
            else{
                st[a] = true;
                sum += d[a][b];
            }
        }
        for(int i = 1; i <= n; i ++ ){
            if(!st[i]){
                success = false;
                break;
            }
        }
        if (vi[1] != vi[v]) success = false;
        
        if(sum == -1){
            printf("Path %d: NA (Not a TS cycle)\n", T);
        } 
        else{
            if(!success){
                printf("Path %d: %d (Not a TS cycle)\n", T, sum);
            }
            else{
                if(v == n + 1) printf("Path %d: %d (TS simple cycle)\n", T, sum);
                else printf("Path %d: %d (TS cycle)\n", T, sum);
                if(sum < min_dist){
                    min_dist = sum;
                    min_id = T;
                }
            }
        }
    }
    printf("Shortest Dist(%d) = %d\n", min_id, min_dist);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45660485/article/details/126046421
Recomendado
Clasificación