您的位置:首页 > 其它

洛谷 P1027 Car的旅行路线

2017-07-14 14:45 337 查看

洛谷 P1027 Car的旅行路线

题目

题目描述

又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。



图例(从上而下)

机场 高速铁路

飞机航线

  注意:图中并没有

标出所有的铁路与航线。

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。

找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

输入输出格式

输入格式:

第一行为一个正整数n(0<=n<=10),表示有n组测试数据。

每组的第一行有四个正整数s,t,A,B。

S(0

1
3 10 1 3
1 1 1 3 3 1 30
2 5 7 4 5 2 1
8 6 8 8 11 6 3


输出样例#1:

47.5


题解

Floyd,就是数据构造有点烦

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#define INF 0x7fffffff
#define sqr(x) x*x
using namespace std;

int n,s,tt,a,b;
int x[1005],y[1005],ti[505];
double d[505][505];

void work(int a,int b)
{
d[a][b]=sqrt(sqr((x[a]-x[b]))+sqr((y[a]-y[b])));
if (((a-1)/4)==((b-1)/4)) d[a][b]=d[a][b]*ti[(a-1)/4+1];
else d[a][b]=d[a][b]*tt;
d[b][a]=d[a][b];
return;
}

int find(int a,int b,int c)
{
if ((d[a][b]>d[b][c])&&(d[a][b]>d[a][c])) return c;
if ((d[a][c]>d[b][c])&&(d[a][c]>d[a][b])) return b;
if ((d[b][c]>d[a][b])&&(d[b][c]>d[a][c])) return a;
}

void get(int a,int b,int c)
{
work(a,b);
work(b,c);
work(c,a);
int t=find(a,b,c);
if (t==a)
{
x[c+1]=x[c]+x[b]-x[a];
y[c+1]=y[c]+y[b]-y[a];
}
if (t==b)
{
x[c+1]=x[c]+x[a]-x[b];
y[c+1]=y[c]+y[a]-y[b];
}
if (t==c)
{
x[c+1]=x[a]+x[b]-x[c];
y[c+1]=y[a]+y[b]-y[c];
}
}

int main()
{
scanf("%d",&n);
while (n--)
{
scanf("%d%d%d%d",&s,&tt,&a,&b);
int i,j,k;
for (i=1;i<=505;i++)
for (j=1;j<=505;j++)
d[i][j]=INF;
for (i=1;i<=s;i++)
{
scanf("%d%d%d%d%d%d%d",&x[4*i-3],&y[4*i-3],&x[4*i-2],&y[4*i-2],&x[4*i-1],&y[4*i-1],&ti[i]);
get(4*i-3,4*i-2,4*i-1);
}
for (i=1;i<=4*s;i++)
for (j=1;j<=4*s;j++)
work(i,j);
for (k=1;k<=4*s;k++)
for (i=1;i<=4*s;i++)
for (j=1;j<=4*s;j++)
if (d[k][j]+d[i][k]<d[i][j]) d[i][j]=d[k][j]+d[i][k];
double ans=1000000000.0;
for (i=4*a-3;i<=4*a;i++)
for (j=4*b-3;j<=4*b;j++)
if (d[i][j]<ans) ans=d[i][j];
printf("%.1lf\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: