洛谷 P1027 【Car的旅行路线】
题目描述
又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第i个城市中高速铁路的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。
图例(从上而下)
机场 高速铁路 飞机航线
注意:图中并没有标出所有的铁路与航线。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入
第一行为一个正整数n(0<=n<=10),表示有n组测试数据。
每组的第一行有四个正整数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个城市高速铁路单位里程的价格。
输出
共有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.5来源
NOIP2001提高组
本题我们不妨把每个城市的4个机场看做四个点。那样这图就有4×s个点。
根据题目描述,我们又知道:每一个机场都与另外每一个机场互通,差别只是在是否是同一个城市:
如果是,那么只能走高速铁路;
如果不是,那么只能走航道。用一个判断来计算这条路的花费即可。
最后跑最短路,答案为到达城市的4个机场的花费的最小值。
(因为有几行太长了,另一种着色方法的代码格式会乱,只好用这种了【手动滑稽】)
#include <cstdio>
#include <cmath>
#include <cstring>
#include <queue>
using namespace std; struct data {
int x,y; //(x,y)
int city; // 所在城市
}; const int maxn=100;
int s,t,A,B;
int T[maxn+1];
double dis[maxn<<2|1];
data a[maxn<<2|1]; int pingfang(int x) { return x*x; } //两点间距离公式
double juli(int x1, int y1, int x2, int y2) { return sqrt(pingfang(x1-y1)+pingfang(x2-y2)); } //求矩形的第四个点的函数
void get_4th(int x1, int y1, int x2, int y2, int x3, int y3, int i) {
//已知A(x1,y1),B(x2,y2),C(x3,y3),求D(x4,y4)
//ab表示AB^2,ac表示AC^2,BC表示BC^2
int ab=pingfang(x1-x2)+pingfang(y1-y2),
ac=pingfang(x1-x3)+pingfang(y1-y3),
bc=pingfang(x2-x3)+pingfang(y2-y3);
int x4,y4;
//用勾股定理的逆定理,判断谁是直角边
//再根据矩形对边平行的性质,算出第四个点的坐标
if (ab+ac==bc) x4=x2+x3-x1, y4=y2+y3-y1;
if (ab+bc==ac) x4=x1+x3-x2, y4=y1+y3-y2;
if (ac+bc==ab) x4=x1+x2-x3, y4=y1+y2-y3;
a[i+3].x=x4;
a[i+3].y=y4;
} //初始化函数如题意所述
void init() {
memset(a,0,sizeof(a));
scanf("%d%d%d%d",&s,&t,&A,&B);
//对每个城市的机场进行处理
for (int i=1; i<=4*s; i+=4) {
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;
//调用求出第四个点坐标的函数
get_4th(a[i].x,a[i].y,a[i+1].x,a[i+1].y,a[i+2].x,a[i+2].y,i);
}
} //最短路spfa
void spfa() {
//队内有没有该元素(用于加速)
bool mark[maxn<<2|1];
queue <int> q;
for (int i=1; i<=4*s; i++) dis[i]=99999999.99999;
//可以从出发地任意一个机场出发,所以初始化都入队,并且花费均为0
for (int i=A*4-3;i<=A*4;i++)
dis[i]=0, q.push(i), mark[i]=true; //bfs
while (!q.empty()) {
int x=q.front(); q.pop(); mark[x]=false;
//这个机场与其余所有机场都有通路
for (int i=1; i<=4*s; i++) {
if (i==x) continue;
//花费先赋值为两点间的距离
double cost=juli(a[x].x,a[i].x,a[x].y,a[i].y);
//如果两机场在同一城市,则走该城市的高速铁路
if (a[i].city==a[x].city) cost*=T[a[i].city];
//否则坐飞机
else cost*=t;
//如果花费更少则更新
if (dis[x]+cost<dis[i]) {
dis[i]=dis[x]+cost;
if (!mark[i])
mark[i]=true, q.push(i);
}
}
}
} int main() {
int n;
scanf("%d",&n); //有多组数据
while (n--) {
init();
spfa();
//答案是到达地四个机场中花费最少的那个
//用“打擂台”的方法求出最小值
double ans=dis[B*4];
for (int i=B*4-3; i<B*4; i++)
if (dis[i]<ans) ans=dis[i];
printf("%.1lf",ans);
}
}
洛谷 P1027 【Car的旅行路线】的更多相关文章
- 洛谷P1027 Car的旅行路线
洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- 洛谷 P1027 Car的旅行路线
P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...
- 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...
- [NOIP2001] 提高组 洛谷P1027 Car的旅行路线
题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个 矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单 ...
- 洛谷——P1027 Car的旅行路线
https://www.luogu.org/problem/show?pid=1027#sub 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于 ...
- 洛谷1027 Car的旅行路线
原题链接 将每个城市拆成四个点,即四个机场来看,那么这题就是求最短路. 不过建图有些麻烦,先要找出第四个机场的坐标. 设另外三个机场的坐标为\((x_1, y_1), (x_2, y_2), (x_3 ...
- DP【洛谷P2134】 百日旅行
[洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...
- AC日记——Car的旅行路线 洛谷 P1027
Car的旅行路线 思路: 这题不难,就是有点恶心: 而且,请认真读题目(就是题目卡死劳资): 来,上代码: #include <cmath> #include <cstdio> ...
- P1027 car的旅行路线
car的旅行路线 洛谷链接 这个题关键就是 如何把每个点表示出来,其实求出四个点的坐标后,只需要把这些点连接起来,用一遍folyed求出最短路径就好了. 代码: #include<cmath&g ...
- BZOJ1880或洛谷2149 [SDOI2009]Elaxia的路线
BZOJ原题链接 洛谷原题链接 显然最长公共路径是最短路上的一条链. 我们可以把最短路经过的边看成有向边,那么组成的图就是一张\(DAG\),这样题目要求的即是两张\(DAG\)重合部分中的最长链. ...
随机推荐
- Cookie/Session的机制与安全
转载自:https://harttle.land/2015/08/10/cookie-session.html Cookie和Session是为了在无状态的HTTP协议之上维护会话状态,使得服务器可以 ...
- MySQL数据库一般设计规则
一.数据库设计 规则一之存储规则: 一般情况可以选择MyISAM存储引擎,如果需要事务支持必须使用InnoDB存储引擎. 注意:MyISAM存储引擎 B-tree索引有一个很大的限制:参与一个索引的所 ...
- 一次 Spark SQL 性能提升10倍的经历(转载)
1. 遇到了啥问题 是酱紫的,简单来说:并发执行 spark job 的时候,并发的提速很不明显. 嗯,且听我慢慢道来,啰嗦点说,类似于我们内部有一个系统给分析师用,他们写一些 sql,在我们的 sp ...
- DetNet: A Backbone network for Object Detection 笔记
1 前言 主要贡献: (1)第一个分析微调传统ImageNet预训练模型应用于目标检测器的固有缺点 (2)提出一个名为DetNet的新的骨干结构,它通过保持空间分辨率和扩大感受野的方式来专门设计用于目 ...
- new Date() IE浏览器下不起做用的解决方法
因为需要计算两个时间之间的差值,所以我用了new Date().getTime()来算的两个时间的时间戳,后来突然发现IE浏览器算的值是NaN. 下面是我在Ie浏览器下打印的结果: 我发现如果不加时分 ...
- PHPexcel(2)
//导出 public function export(){ $xlsData = Db('ent_apply')->select(); Vendor('PHPExcel.PHPExcel'); ...
- vuepress 学习心得
vuepress是一个静态网站生成器,在我看来就是写博客和教程的好工具.教程请见官网:https://www.vuepress.cn 安装方法建议局部安装:node8.0以上,新建vue项目,可能会出 ...
- ubuntu16.04 backup and restore
http://blog.csdn.net/qq_35523593/article/details/78545530
- Debian下安装中文包和输入法
Debian下安装中文包和输入法 #aptitude install locales(没有aptitude的话可以先安装apt-get insall aptitude ) #dpkg-reconfi ...
- laravel5.7 前后端分离开发 实现基于API请求的token认证
最近在学习前后端分离开发,发现 在laravel中实现前后台分离是无法无法使用 CSRF Token 认证的.因为 web 请求的用户认证是通过Session和客户端Cookie的实现的,而前后端分离 ...
