기술
평면에서 포인트 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;
}