首先,让我骂一句那没事找事的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. json:格式化数据

    formatData = JSON.Stringfy(data, null, 2)

  2. pytorch Model Linear实现线性回归CUDA版本

    实验代码 import torch import torch.nn as nn #y = wx + b class MyModel(nn.Module): def __init__(self): su ...

  3. tp5命名空间补充

    1.非限定名称访问方式: 直接访问当前的空间和元素 2.限定名称命名空间: 路径\方法();  相当于相对路径 以当前的命名空间为起点,去找路径上的方法 3.完全限定名称访问方式:\路径\方法();  ...

  4. 查看现有的 cipher suite

    openssl ciphers [-v] [-ssl2] [-ssl3] [-tls1] [cipherlist]

  5. java中使用Semaphore构建阻塞对象池

    java中使用Semaphore构建阻塞对象池 Semaphore是java 5中引入的概念,叫做计数信号量.主要用来控制同时访问某个特定资源的访问数量或者执行某个操作的数量. Semaphore中定 ...

  6. Linux系统curl获取公网ip

    收集了几个查询当前公网ip的网址,可以通过curl命令方便的查看 curl cip.cc curl ipinfo.io curl myip.ipip.net curl http://members.3 ...

  7. pvresize

    lvm pv 扩容 pvresize 当PV对应的设备分区(如md软raid)扩容之后,利用该命令可以扩容PV

  8. linux-网络管理(常用命令)

    网络查看 ifconfig : 查看与临时配置网络 ifdown 网卡设备名 : 关闭网卡 ifup 网卡设备名 : 启用网卡 netstat 网络状态查询 -t 列出TCP协议端口 -u 列出UDP ...

  9. 现代软件工程讲义 如何提出靠谱的项目建议 NABCD

    互联网时代对于创新者来说, 既是一个伟大的时代, 又是一个糟糕的时代. 你有很多机会做出影响世界的产品,  但是, 似乎任何想法都被别人想到过了, 做出来了, 上市了, 移植到各种平台上去了-  那么 ...

  10. 面向对象第四单元(UML)总结

    OO第四单元 一.总结本单元两次作业的架构设计 第一次作业 架构 第一次作业只有类图,所以全部的UmlElement都可以放在MyUmlInteraction中进行存储.计算和查找.对于类图来说,可以 ...