您的位置:首页 > 其它

Car的旅行路线

2015-09-19 20:06 267 查看

描述

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

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

格式

输入格式

第一行有四个正整数s,t,A,B。S(0<S<=100)表示城市的个数,t表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1<=A,B<=S)。

接下来有S行,其中第I行均有7个正整数xi1,yi1,xi2,yi2,xi3,yi3,Ti,这当中的(xi1,yi1),(xi2,yi2),(xi3,yi3)分别是第I个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。

输出格式

输出最小费用(结果保留两位小数)

样例1

样例输入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.55

限制

每个测试点1s

来源

NOIP2001第四题

 

  题不难,但相当考验编程能力,,这题在考场上要有耐心

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<fstream>
using namespace std;
const int inf=1e9;
int N,city_num,S,T;
int fly_cost;
int tot;
struct node{
int x[5],y[5];
}Airport[200];
int road_cost[200];
int vis[200][200];
int to[200][200];
double cost[200][200];
double ANS;
int min1(double a1,double a2){
if(a1<a2) return a1;
else return a2;
}
void calc_roadcost(int xx){//计算机场之间的铁路费用,xx表示机场标号

for(int i=1;i<=4;i++){//机场标号
int u=4*(xx-1)+i;//在图中代表的点的标号
for(int j=1;j<=4;j++){//机场标号
int v=4*(xx-1)+j;//在图中代表的点的标号
if(u!=v&&vis[u][v]==0&&vis[v][u]==0){//如果不是同一个点,且没有建立过连接
vis[u][v]=1; vis[v][u]=1;
int e=++to[u][0];
int r=++to[v][0];
to[u][e]=v; to[v][r]=u;

double dis=((double)Airport[xx].x[i]-(double)Airport[xx].x[j])*((double)Airport[xx].x[i]-(double)Airport[xx].x[j])+
((double)Airport[xx].y[i]-(double)Airport[xx].y[j])*((double)Airport[xx].y[i]-(double)Airport[xx].y[j]);
dis=sqrt(dis);
dis*=(double)road_cost[xx];
cost[u][e]=dis; cost[v][r]=dis;
}
}
}

}

void calc_fly_cost(){//计算机场之间的航线费用

for(int i=1;i<=city_num;i++){//城市标号
for(int j=1;j<=4;j++){//城市中的机场
int u=4*(i-1)+j;//此机场在图中的标号
for(int k=1;k<=city_num;k++){//城市标号
if(k!=i){//保证不是同一个城市
for(int t=1;t<=4;t++){//城市中的机场
int v=4*(k-1)+t;//此机场在图中的标号

if(vis[u][v]==0&&vis[v][u]==0){//没有建立过连接
vis[u][v]=1; vis[v][u]=1;
int e=++to[u][0];
int r=++to[v][0];

to[u][e]=v; to[v][r]=u;
double dis=sqrt(((double)Airport[i].x[j]-(double)Airport[k].x[t])*((double)Airport[i].x[j]-
                          (double)Airport[k].x[t])+((double)Airport[i].y[j]-(double)Airport[k].y[t])*
                          ((double)Airport[i].y[j]-(double)Airport[k].y[t]));
dis*=(double)fly_cost;
cost[u][e]=dis; cost[v][r]=dis;

}
else continue;
}
}
else continue;
}
}
}

}
void SPFA(int s){

static queue<int> Q;
double dis[200];
bool vis2[200];

for(int i=0;i<=199;i++) dis[i]=(double)inf;
memset(vis2,false,sizeof(vis2));
while(Q.size()>0) Q.pop();

dis[s]=(double)0;
Q.push(s); vis2[s]=true;

while(Q.size()>0){
int x=Q.front(); Q.pop();
vis2[x]=false;
for(int i=1;i<=to[x][0];i++){
int y=to[x][i];
if(dis[y]>dis[x]+cost[x][i]){
dis[y]=dis[x]+cost[x][i];
if(vis2[y]==false){
vis2[y]=true;
Q.push(y);
}
}
}
}

for(int i=1;i<=4;i++){
int v=4*(T-1)+i;
if(dis[v]<(double)ANS){
ANS=dis[v];
}
}

}
inline double calc_dis(int x1,int x2,int y1,int y2){//两点间距离的平方
return ((double)x1-(double)x2)*((double)x1-(double)x2)+
((double)y1-(double)y2)*((double)y1-(double)y2);
}
int main(){
scanf("%d%d%d%d",&city_num,&fly_cost,&S,&T);
tot=4*city_num;
for(int j=1;j<=city_num;j++){
scanf("%d%d%d%d%d%d%d",&Airport[j].x[1],&Airport[j].y[1],
&Airport[j].x[2],&Airport[j].y[2],
&Airport[j].x[3],&Airport[j].y[3],
&road_cost[j]);

if(calc_dis(Airport[j].x[1],Airport[j].x[2],Airport[j].y[1],Airport[j].y[2])==
calc_dis(Airport[j].x[1],Airport[j].x[3],Airport[j].y[1],Airport[j].y[3])+
calc_dis(Airport[j].x[2],Airport[j].x[3],Airport[j].y[2],Airport[j].y[3])
)//说明 3是直角顶点
Airport[j].x[4]=Airport[j].x[1]+Airport[j].x[2]-Airport[j].x[3],
Airport[j].y[4]=Airport[j].y[1]+Airport[j].y[2]-Airport[j].y[3];

else if(calc_dis(Airport[j].x[1],Airport[j].x[3],Airport[j].y[1],Airport[j].y[3])==
calc_dis(Airport[j].x[1],Airport[j].x[2],Airport[j].y[1],Airport[j].y[2])+
calc_dis(Airport[j].x[3],Airport[j].x[2],Airport[j].y[3],Airport[j].y[2])
)//说明 2是直角顶点
Airport[j].x[4]=Airport[j].x[1]+Airport[j].x[3]-Airport[j].x[2],
Airport[j].y[4]=Airport[j].y[1]+Airport[j].y[3]-Airport[j].y[2];

else if(calc_dis(Airport[j].x[2],Airport[j].x[3],Airport[j].y[2],Airport[j].y[3])==
calc_dis(Airport[j].x[2],Airport[j].x[1],Airport[j].y[2],Airport[j].y[1])+
calc_dis(Airport[j].x[3],Airport[j].x[1],Airport[j].y[3],Airport[j].y[1])
)//说明 1是直角顶点
Airport[j].x[4]=Airport[j].x[2]+Airport[j].x[3]-Airport[j].x[1],
Airport[j].y[4]=Airport[j].y[2]+Airport[j].y[3]-Airport[j].y[1];

calc_roadcost(j);//计算机场之间的铁路费用
}
calc_fly_cost();//计算机场之间的航线费用
ANS=inf;
for(int i=1;i<=4;i++){
int from=4*(S-1)+i;
SPFA(from);
}
printf("%.2f",ANS);
return 0;
}

 

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: