洛谷P1027题解
还取一个那么奇怪的名字
看到这个题,恕我直言,我们明显可以看出这是一道图的最短路问题。由于这个题的数据范围很小(s只有100),所以在这里我们选取时间复杂度为O(n^3)的Floyd主要是好写。
int a,b;
scanf("%d%d%d%d",&n,&tf,&a,&b);
for(int i=;i<=*n;i++)
for(int j=;j<=*n;j++)
e[i][j]=inf;
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
scanf("%d",wz[i]+j);
for(int j=;j<=;j+=)
{
wz[i][]+=wz[i][j];
wz[i][]+=wz[i][j+];
}
scanf("%d",wz[i]+);
这里用了一个wz[][]数组,wz[i][j](j=1,3,5,7)表示第i座城市的四个点的横坐标,wz[i][j](j=2,4,6,8)表示第i座城市的四个点的纵坐标,而j=9则是路费。其中wz[i][7]与wz[i][8]是要去计算的。
而怎么算呢?我们可以得到一个公式xd=xa+xb-xc。 (y类似)(我们可以知道,已知的三点肯定是一个直角三角形,而(xa,ya)是TA的直角顶点,(xd,yd)便是TA所对的点。公式证明留给读者去思考。提示:利用两对角线交点是中点,然后使用中点坐标公式。)但我们还需要知道谁是直角顶点,这里很明显可以利用勾股定理求解。(当然还可以使用斜率乘积等于-1,但作者血与泪的教训还是建议你不要尝试。也可能是我太菜了)
double tp[];
int tp2=inf,tp3;
tp[]=dist1(wz[i][],wz[i][],wz[i][],wz[i][]);
tp[]=dist1(wz[i][],wz[i][],wz[i][],wz[i][]);
tp[]=dist1(wz[i][],wz[i][],wz[i][],wz[i][]);
if(tp[]+tp[]==tp[]){//我在之前把wz[i][7]处理成wz[i][1,3,5]的和,
//这里直接减两倍横纵坐标
wz[i][]-=*wz[i][];wz[i][]-=*wz[i][];
}
else if(tp[]+tp[]==tp[]){
wz[i][]-=*wz[i][];wz[i][]-=*wz[i][];
}
else if(tp[]+tp[]==tp[]){
wz[i][]-=*wz[i][];wz[i][]-=*wz[i][];
}
}
这是dis1函数
double dist(int a,int b,int c,int d){
return sqrt((a-b)*(a-b)*1.0+1.0*(c-d)*(c-d));
}
然后枚举构造某城市之间飞机场的边。(这里我把城市里的每个顶点当一个点)
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
for(int k=j;k<=;k++)
{
int u=(i-)*+j,v=(i-)*+k;//记得减一
double dis=dist(wz[i][j*-],wz[i][k*-],wz[i][j*],wz[i][k*]);
e[u][v]=e[v][u]=dis*wz[i][];
}
}
dist函数(与dist1的唯一区别就是开了根号)
double dist(int a,int b,int c,int d){
return sqrt((a-b)*(a-b)*1.0+1.0*(c-d)*(c-d));
}
接下来便是城市间最短距离的代码
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j){//关键!!!作者调了一小时(┬_┬)
for(int k=;k<=;k++)
for(int l=;l<=;l++)
{
int u=(i-)*+k,v=(j-)*+l;
double dis=dist(wz[i][k*-],wz[j][l*-],wz[i][k*],wz[j][l*]);
e[u][v]=dis*tf;
}
}
然后便是我们期待已久的Floyd
for(int k=;k<=n*;k++)
for(int i=;i<=n*k;i++)
for(int j=;j<=n*;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
最后枚举起点终点,找到最短路
ouble ans=inf;
for(int i=(a-)*+;i<=a*;i++)
for(int j=(b-)*+;j<=b*;j++)
ans=min(ans,e[i][j]);
printf("%.1lf",ans);
是不是很简单?
害我调了半天,万恶的Car
最后给出完整代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=,maxm=,inf=0x3f3f3f3f;
double e[][];
int wz[][];
int n,tf;
double dist(int a,int b,int c,int d){
return sqrt((a-b)*(a-b)*1.0+1.0*(c-d)*(c-d));
}
double dist1(int a,int b,int c,int d){
return (a-b)*(a-b)*1.0+1.0*(c-d)*(c-d);
}
int main()
{
int t;
cin>>t;
while(t--)
{
int a,b;
scanf("%d%d%d%d",&n,&tf,&a,&b);
for(int i=;i<=*n;i++)
for(int j=;j<=*n;j++)
e[i][j]=inf;
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
scanf("%d",wz[i]+j);
for(int j=;j<=;j+=)
{
wz[i][]+=wz[i][j];
wz[i][]+=wz[i][j+];
}
scanf("%d",wz[i]+);
double tp[];
int tp2=inf,tp3;
tp[]=dist1(wz[i][],wz[i][],wz[i][],wz[i][]);
tp[]=dist1(wz[i][],wz[i][],wz[i][],wz[i][]);
tp[]=dist1(wz[i][],wz[i][],wz[i][],wz[i][]);
if(tp[]+tp[]==tp[]){
wz[i][]-=*wz[i][];wz[i][]-=*wz[i][];
}
else if(tp[]+tp[]==tp[]){
wz[i][]-=*wz[i][];wz[i][]-=*wz[i][];
}
else if(tp[]+tp[]==tp[]){
wz[i][]-=*wz[i][];wz[i][]-=*wz[i][];
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
for(int k=j;k<=;k++)
{
int u=(i-)*+j,v=(i-)*+k;
double dis=dist(wz[i][j*-],wz[i][k*-],wz[i][j*],wz[i][k*]);
e[u][v]=e[v][u]=dis*wz[i][];
}
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
if(i!=j){
for(int k=;k<=;k++)
for(int l=;l<=;l++)
{
int u=(i-)*+k,v=(j-)*+l;
double dis=dist(wz[i][k*-],wz[j][l*-],wz[i][k*],wz[j][l*]);
e[u][v]=dis*tf;
}
}
for(int k=;k<=n*;k++)
for(int i=;i<=n*k;i++)
for(int j=;j<=n*;j++)
if(e[i][j]>e[i][k]+e[k][j])
e[i][j]=e[i][k]+e[k][j];
double ans=inf;
for(int i=(a-)*+;i<=a*;i++)
for(int j=(b-)*+;j<=b*;j++)
ans=min(ans,e[i][j]);
printf("%.1lf",ans);
}
return ;
}
洛谷P1027题解的更多相关文章
- 洛谷P1027 Car的旅行路线
洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码
[洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...
- 洛谷P5759题解
本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \ ...
- 关于三目运算符与if语句的效率与洛谷P2704题解
题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...
- c++并查集配合STL MAP的实现(洛谷P2814题解)
不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. ...
- 洛谷P2607题解
想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...
- 【洛谷】题解 P1056 【排座椅】
题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...
- 洛谷 P1027 Car的旅行路线
P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...
- 洛谷P3572题解
这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简 ...
随机推荐
- 立体匹配-----NCC视差匹配
目录 一.立体匹配算法 1.立体匹配算法分类 二.NCC 视差匹配方法 1.原理 2.NCC计算公式 3.算法流程 4.代码实现 5.不同场景运行 三.结论 四.遇到的问题及解决方法 一.立体 ...
- Django编写自定义manage.py 命令
官网文档地址:编写自定义 django-admin 命令 金句: 你所浪费的今天,正是昨天死的人所期待的明天. 开篇话: python manage.py <command> 的命令我们用 ...
- thinkphp5.0.x
payload5.0.24 http://-----/index.php?s=index/think\app/invokefunction&function=call_user_func_ar ...
- php函数封装
这是一些自定义封装的函数类,调用起来很方便,以后会有更多的封装函数更新! // 弹框跳转function alert($msg,$url=''){ echo "<script>& ...
- Golang快速入门:从菜鸟变大佬
最近写了不少Go代码,但是写着写着,还是容易忘,尤其是再写点Python代码后.所以找了一篇不错的Golang基础教程,翻译一下,时常看看. 原文链接: 「Learning Go - from zer ...
- Python与Excel交互——Xlwings实战
这一期直接来实战. 比如说,我们在一个快递网站上爬取了几个快递的轨迹信息,我们需要将数据保存下来,一个常规做法是把数据保存在数据库里(Mysql,MongoDB,Redis),另一个是用Excel的形 ...
- centos 服务器上部署 xxl-job 通过 feign 访问 eureka 上注册的 service timeout
部署方式 1.使用 jar 包部署 出现的问题 1.通过 feign 调用其他服务,出现超时的问题,该问题不是 ribbon.hystrix 没有配置导致的超时,经过测试,即使配置了也没有作用,该方法 ...
- Spring Boot Starters介绍
文章目录 Web Start Test Starter Data JPA Starter Mail Starter 结论 对于任何一个复杂项目来说,依赖关系都是一个非常需要注意和消息的方面,虽然重要, ...
- Zookeeper之Error contacting service. It is probably not running.
安装ZooKeeper时,无论是修改zoo.cfg:还是myid,都检查了几遍都没有错误.但是开启Zookeeper服务时出现: Error contacting service. It is pro ...
- vue 比 js的强大
//js写留言板 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...