B - el camino más corto (Freud)

Descripción

De n puntos en el plano (n <= 100), las coordenadas de cada punto son entre -10.000 a 10.000. Hay una serie de puntos de conexión entre ellos. Si la conexión, entonces se puede llegar desde un punto a otro punto, ese camino entre dos puntos, la distancia de una distancia de la trayectoria en línea recta entre dos puntos. La tarea ahora es encontrar la distancia más corta desde un punto a otro.
entrada

El primer comportamiento número entero n.
La fila 2 a la fila n + 1 (de n líneas), cada fila dos enteros x e y, coordenadas de un punto descrito (separadas por un espacio).
Un comportamiento del entero n + 2 m, la figura representa el número de conexión.
Después de que las m filas, cada fila describe una conexión de dos números enteros i y j que consisten, expresado el punto de conexión entre el i-ésimo y j-ésimo puntos.
Última línea: dos enteros s y t, respectivamente, representan los puntos de origen y destino.
salida

Sólo una línea, un número real (dos decimales), representa la longitud del camino más corto de s a t.
muestra

Entrada

5
0 0
2 0
2 2
0 2
3 1
5
1 2
1 3
1 4
2 5
3 5
1 5
de salida

3.41

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h>
#include<queue>
#include<math.h>
#define INF 0x3f3f3f3f
using namespace std;
int n,m;
double Map[12000][12000];
int mapx[12000],mapy[12000];
void floyd()
{
    int i,j,k;
    for(k=1;k<=n;k++)
    {
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=n;j++)
            {
                if(Map[i][j]>Map[i][k]+Map[k][j])
                    Map[i][j] = Map[i][k]+Map[k][j];
            }
        }
    }
}
int main()
{
   int u,v,i,j;
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=n; j++)
        {
            Map[i][j]=Map[j][i]=INF;
        }
        Map[i][i]=0;
    }
    for(i=1;i<=n;i++)
    {
        scanf("%d %d",&mapx[i],&mapy[i]);
    }
    scanf("%d",&m);
    for(i = 1;i<=m;i++)
    {
         scanf("%d %d",&u,&v);
         double w;
         w = sqrt((double)(mapx[v] - mapx[u])*(double)(mapx[v] - mapx[u]) +
         (double)(mapy[v] - mapy[u])*(double)(mapy[v] - mapy[u]));
         if(Map[u][v]>w)
         {
             Map[u][v] = Map[v][u] = w;
         }
    }
    floyd();
    int e,s;
    scanf("%d %d",&e,&s);
    printf("%.2lf\n",Map[e][s]);
    return 0;

}

Publicados 177 artículos originales · ganado elogios 7 · Vistas a 30000 +

Supongo que te gusta

Origin blog.csdn.net/Fusheng_Yizhao/article/details/104895180
Recomendado
Clasificación