B - 최단 경로 (프로이드)

기술

평면에서 포인트 N (N <= 100), 각 점의 좌표는 -10,000 10,000 사이이다. 그들 사이의 연결 지점의 숫자가있다. 연결 경우, 한 지점에서 다른 지점으로 두 지점, 두 지점 간의 직선 거리로의 거리와 그 경로에 도달 할 수있다. 작업은 이제 다른 한 지점에서 최단 거리를 찾는 것입니다.
입력

첫 번째 행동의 정수 n.
N + 1 (N 라인의) 행을 2 행 (공백으로 구분), x 및 y는 두 개의 정수, 점의 좌표가 각 행에 기재.
정수 N + 2m의 거동은도 연결의 수를 나타낸다.
M 개의 열 후 각 행 i 및 j는 정수로 이루어진 두 개의 연결을 설명, i 번째와 j 번째 지점 사이의 연결 지점을 나타냈다.
마지막 라인 : 두 개의 정수 s와 t, 각각의 소스 및 대상 포인트를 나타냅니다.
산출

오직 하나 개의 라인은, 실제 번호 (소수점 두 자릿수)가 t에의 최단 경로의 길이를 나타낸다.
견본

입력

5
0 0
2 0
2
0 2
3 1
5
1 2
1-3
1-4
2-5
3-5
1-5
출력

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;

}

게시 된 177 개 원래 기사 · 원 찬양 7 ·은 30000 +를 볼

추천

출처blog.csdn.net/Fusheng_Yizhao/article/details/104895180