首先,让我骂一句那没事找事的Car
还取一个那么奇怪的名字
看到这个题,恕我直言,我们明显可以看出这是一道图的最短路问题。由于这个题的数据范围很小(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题解的更多相关文章

  1. 洛谷P1027 Car的旅行路线

    洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...

  2. [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码

    [洛谷P3376题解]网络流(最大流)的实现算法讲解与代码 更坏的阅读体验 定义 对于给定的一个网络,有向图中每个的边权表示可以通过的最大流量.假设出发点S水流无限大,求水流到终点T后的最大流量. 起 ...

  3. 洛谷P5759题解

    本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759 \[这道题重在理解题意 \] 选手编号依次为: \ ...

  4. 关于三目运算符与if语句的效率与洛谷P2704题解

    题目描述 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用“H” 表示),也可能是平原(用“P”表示),如下图.在每一格平原地形上最 ...

  5. c++并查集配合STL MAP的实现(洛谷P2814题解)

    不会并查集的话请将此文与我以前写的并查集一同食用. 原题来自洛谷 原题 文字稿在此: 题目背景 现代的人对于本家族血统越来越感兴趣. 题目描述 给出充足的父子关系,请你编写程序找到某个人的最早的祖先. ...

  6. 洛谷P2607题解

    想要深入学习树形DP,请点击我的博客. 本题的DP模型同 P1352 没有上司的舞会.本题的难点在于如何把基环树DP转化为普通的树上DP. 考虑断边和换根.先找到其中的一个环,在上面随意取两个点, 断 ...

  7. 【洛谷】题解 P1056 【排座椅】

    题目链接 因为题目说输入保证会交头接耳的同学前后相邻或者左右相邻,所以一对同学要分开有且只有一条唯一的通道才能把他们分开. 于是可以吧这条通道累加到一个数组里面.应为题目要求纵列的通道和横列的通道条数 ...

  8. 洛谷 P1027 Car的旅行路线

    P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...

  9. 洛谷P3572题解

    这道题实在是一道 毒瘤 题,太坑爹了.那个写 \(deque\) 的题解亲测只有80分,原因 不言而明 ,这道题居然 丧心病狂 到 卡STL . 好了,不吐槽了,进入正题 题目分析: 这是一道十分 简 ...

随机推荐

  1. Istio架构详解

    Istio架构及其组件概述 Istio 架构总体来说分为控制面和数据面两部分.控制面是 Istio 的核心,管理 Istio 的所有功能,主要包括Pilot.Mixer.Citadel等服务组件;数据 ...

  2. [函数] PHP取二进制文件头快速判断文件类型

    一般我们都是按照文件扩展名来判断文件类型,但其实不太靠谱,因为可以通过修改扩展名来伪装文件类型.其实我们可以通过读取文件信息来识别,比如 PHP扩展中提供了类似 exif_imagetype 这样的函 ...

  3. QtConcurrent::run 运行类的成员函数

    https://stackoverflow.com/questions/2152355/is-it-possible-to-use-qtconcurrentrun-with-a-function-me ...

  4. JAVA企业级应用TOMCAT实战(二)

    使用普通用户运行 使用普通用户来部署服务是比较安全的做法 [root@tomcat application]# useradd -u tomcat [root@tomcat application]# ...

  5. Python2 和 Python3的区别

    Python2 和 Python3的区别: 1.python2的默认编码方式是ascii码:python3的默认编码是utf-8. 如果出现乱码或者编码错误,可以使用以下编码在文件头来指定编码: #- ...

  6. 与IBM的Lin Sun关于Istio 1.0和微服务的问答

    北京时间 7 月 31 日,Istio 正式发布了 1.0 版本,并表示已经可用于生产环境.该版本的主要新特性包括跨集群 mesh 支持.细粒度流量控制以及在一个 mesh 中增量推出 mutual ...

  7. angular2相关

    脚手架安装一个项目 1.全局安装angular脚手架 npm install -g @angular/cli 2.初始化一个文件夹 ng new my-angular-demo 3.进入文件夹 cd ...

  8. struts2验证码

    验证码大多是jsp,servlet写的. 我拿来主义了, 再自己完善了一下(我一直努力想要站在巨人的肩膀)   首先是页面 test.jsp <%@ page contentType=" ...

  9. #Week2 Linear Regression with One Variable

    一.Model Representation 还是以房价预测为例,一图胜千言: h表示一个从x到y的函数映射. 二.Cost Function 因为是单变量线性回归,所以假设函数是: \[h_{\th ...

  10. 信息竞赛进阶指南--KMP算法(模板)

    next[1] = 0; for (int i = 2, j = 0; i <= n; i++) { while (j > 0 && a[i] != a[j+1]) j = ...