POJ Norte 2387 (fjutacm 1443) Hasta que las vacas vuelvan a casa camino más corto

Descripción del problema
Bessie está fuera en el campo y quiere volver a la granja para conseguir dormir tanto como sea posible antes de Farmer John le despierta para el ordeño de la mañana. Bessie necesita su sueño de belleza, por lo que ella quiere volver lo más rápido posible.

campo del granjero John tiene N (2 <= N <= 1000) de puntos de referencia en el mismo, numeradas de forma única 1 ... N. Landmark 1 es el granero; el bosque de árboles de manzana en la que se encuentra Bessie todo el día es Vacas N. viaje de la señal en el campo usando T (1 <= t <= 2000) bidireccionales de vaca senderos de diferentes longitudes entre los puntos de referencia. Bessie no confía en su capacidad de navegación, por lo que siempre se mantiene en un sendero desde su inicio hasta su fin una vez que se inicia.

Dados los senderos entre los puntos de referencia, determinar la distancia mínima Bessie debe caminar para llegar al establo. Está garantizado que existe algo por el camino.
Entrada

  • Línea 1: Dos enteros: T y N

  • Las líneas 2 ... T + 1: Cada línea describe un rastro como tres enteros separados por espacios. Los dos primeros números enteros son los puntos de referencia, entre los que viaja por el sendero. El tercer número entero es la longitud de la pista, el rango 1 ... 100.
    Salida

  • Línea 1: Un solo número entero, la distancia mínima que Bessie debe viajar para llegar de señal N a puntos de interés 1.
    SampleInput
    5 5
    1 2 20
    2 3 30
    3 4 20
    4 5 20
    1 5 100
    SampleOutput
    90

Significado de las preguntas que se le da T lado bidireccional y los pesos correspondientes, vamos a encontrar el camino más corto hacia atrás a una necesidad de ir a través de la N.
Aquí, he utilizado el algoritmo temporalmente no está claro qué, análisis de algoritmos en los comentarios de código, el primero publicado el código, y luego volver más tarde a conocer la actualización.

#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <stdlib.h>
#include <math.h>
#include <stack>
#include <queue>
#include <vector>
#include <string.h>
using namespace std;
const int MAX=1e3+5;

int N, T;
int dist[MAX][MAX];
bool vis[MAX];
int d[MAX];

int main()
{
  int a, b, c, v, u;
  cin >> T >> N;
  memset(dist, 0x3f, sizeof(dist));
  memset(vis, false, sizeof(vis));
  memset(d, 0x3f, sizeof(d));
  for (int i=0; i<T; i++)
  {
    scanf("%d%d%d", &a, &b, &c);
    if (c<dist[a][b])
    {
      dist[a][b] = dist[b][a] = c;
      if (a==N) d[b] = c;       //把记录起点,到所有点最短路径的一维数组初始化
      else if (b==N) d[a] = c;
    }
  }
  d[N] = 0;       //到自己是0
  while (1)
  {
    v = -1;
    for (int u=1; u<=N; u++)
      if (!vis[u]&&(v==-1||d[u]<d[v]))  // 不断往后找,找到当前没被标记过,且从起
        v = u;                          //点能最快到达的点,以此点为中转点
    if (v==-1) break;                   // 没有没被标记过的点了,就跳出while
    vis[v] = 1;                         // 找到的点标记一下
    for (int u=1; u<=N; u++)            // 找中转点的所有下家,不断更新起点通过中
      d[u] = min(d[u], d[v]+dist[v][u]);//转点到其他所有点的最短路径
  }
  cout << d[1] << endl;
  return 0;
}
Se han publicado 19 artículos originales · ganado elogios 0 · Vistas 511

Supongo que te gusta

Origin blog.csdn.net/qq_43317133/article/details/98203606
Recomendado
Clasificación