【题目描述】
又到暑假了,住在城市A�的Car想和朋友一起去城市B�旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第i�个城市中高速铁路了的单位里程价格为Ti��,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t�。
图例
|
|
机场 高速铁路 机航线 |
注意:图中并没有
标出所有的铁路与航线。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
任务
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
【输入】
第一行为一个正整数n(0≤n≤10)�(0≤�≤10),表示有n组测试数据。
每组的第一行有四个正整数s,t,A,B�,�,�,�。
S(0<S≤100)�(0<�≤100)表示城市的个数,t�表示飞机单位里程的价格,A,B�,�分别为城市A,B�,�的序号,(1≤A,B≤S)(1≤�,�≤�)。
接下来有S�行,其中第i�行均有77个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti��1,��1,��2,��2,��3,��3,��,这当中的(xi1,yi1��1,��1),(xi2,yi2��2,��2),(xi3,yi3��3,��3)分别是第I个城市中任意三个机场的坐标,Ti��为第i�个城市高速铁路单位里程的价格。
【输出】
共有n行,每行一个数据对应测试数据。
【输入样例】
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
【输出样例】
47.55
直接上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int n,s,t,A,B,T[maxn<<2];
double dis[maxn<<2];
bool book[maxn<<2];
/*inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9') if(ch=='-') f=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}*/
struct data{
int city;
int x,y;
}a[maxn<<2];
inline int power_2(int x)
{
return x*x;
}
void getlast(int x1,int y1,int x2,int y2,int x3,int y3,int i)
{
int x4,y4;
int dis1=power_2(x1-x2)+power_2(y1-y2),
dis2=power_2(x1-x3)+power_2(y1-y3),
dis3=power_2(x2-x3)+power_2(y2-y3);
if(dis2==dis1+dis3) x4=x3-x2+x1,y4=y3+y1-y2;
if(dis1==dis2+dis3) x4=x2-x3+x1,y4=y2+y1-y3;
if(dis3==dis1+dis2) x4=x3-x1+x2,y4=y3+y2-y1;
a[i+3].x=x4;a[i+3].y=y4;
}//这道题目唯一需要注意的点大概就是这个求第四个点
inline double distance(int x1,int y1,int x2,int y2)
{
return sqrt(power_2(x1-x2)+power_2(y1-y2));
}
void SPFA()
{
memset(book,0,sizeof(book));
queue <int> q;
for(int i=1;i<=s<<2;i++) dis[i]=99999999;
for(int i=A*4-3;i<=A*4;i++) dis[i]=0,q.push(i),book[i]=1;
while(!q.empty())
{
int u=q.front();q.pop();book[u]=0;
for(int i=1;i<=s<<2;i++)
{
if(i==u) continue;
double cost=distance(a[i].x,a[i].y,a[u].x,a[u].y);
if(a[i].city==a[u].city) cost*=T[a[i].city];
else cost*=t;
if(dis[i]>dis[u]+cost)
{
dis[i]=dis[u]+cost;
if(!book[i])
{
book[i]=1;
q.push(i);
}
}
}
}
}
void init()
{
//memset(t,0,sizeof(t));
memset(a,0,sizeof(a));
scanf("%d%d%d%d",&s,&t,&A,&B);
int i;
for(i=1;i<=s<<2;i+=4)
{
//int x1,x2,x3,y1,y2,y3;
scanf("%d%d%d%d%d%d%d",&a[i].x,&a[i].y,&a[i+1].x,&a[i+1].y,&a[i+2].x,&a[i+2].y,&T[i/4+1]);
a[i].city=a[i+1].city=a[i+2].city=a[i+3].city=i/4+1;
getlast(a[i].x,a[i].y,a[i+1].x,a[i+1].y,a[i+2].x,a[i+2].y,i);
}
}
int main()
{
scanf("%d",&n);
int i;
for(i=1;i<=n;i++)
{
init();
SPFA();
double ans=dis[B<<2];
for(int j=B*4-3;j<B*4;j++) if(ans>dis[j]) ans=dis[j];
printf("%.2lf\n",ans);
}
return 0;
文章介绍了一个计算城市间最优旅游路线的问题,利用SPFA算法解决,以最小化总花费。

743

被折叠的 条评论
为什么被折叠?



