原题链接

将每个城市拆成四个点,即四个机场来看,那么这题就是求最短路。

不过建图有些麻烦,先要找出第四个机场的坐标。

设另外三个机场的坐标为\((x_1, y_1), (x_2, y_2), (x_3, y_3)\),其中\((x_1, y_1), (x_3, y_3)\)为对角线两点。



那么第四个点的坐标即为\((x_1 + x_3 - x_2, y_1 + y_3 - y_2)\)。

这个是通过对角线交点为中点,坐标为线段两端点坐标和的一半算得。当然可以用勾股等方法算。

至于找出对角线的两端点,则可以计算原本三点两两之间的长度,那么最长的就是对角线了。当然用勾股也可以判。

然后就之间跑最短路即可。

这里我用的是\(dijkstra\)。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
using namespace std;
const int N = 110;
const int M = 410;
const int K = M * M;
struct dd {
int x;
double D;
bool operator < (const dd &b) const { return D > b.D; }
};
struct poi {
int x[5], y[5], po[5], z;
};
poi a[N];
int fi[M], ne[K], di[K], st, ed, m, l;
double dis[M], da[K];
bool v[M];
priority_queue<dd>q;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline double minn(double x, double y) { return x < y ? x : y; }
inline void add(int x, int y, double z)
{
di[++l] = y; da[l] = z; ne[l] = fi[x]; fi[x] = l;
di[++l] = x; da[l] = z; ne[l] = fi[y]; fi[y] = l;
}
inline double calc(int x, int y, int xx, int yy, int z) { return sqrt(1.0 * (x - xx) * (x - xx) + 1.0 * (y - yy) * (y - yy)) * z; }//计算边的花费
inline int fin(int k)//找对角线,顺便添入部分铁路
{
int i, j, L = 0, id;
double D[4], ma = 0;
for (i = 1; i < 3; i++)
for (j = i + 1; j < 4; j++)
{
D[++L] = calc(a[k].x[i], a[k].y[i], a[k].x[j], a[k].y[j], a[k].z);
add(a[k].po[i], a[k].po[j], D[L]);
if (ma < D[L])
ma = D[L], id = L;
}
return id ^ 1 ? id ^ 2 ? 1 : 2 : 3;
}
inline void addp(int x, int y)//将两两城市之间的航道建好
{
for (int i = 1; i < 5; i++)
for (int j = 1; j < 5; j++)
add(a[x].po[i], a[y].po[j], calc(a[x].x[i], a[x].y[i], a[y].x[j], a[y].y[j], m));
}
double dij()//dijkstra
{
int i, x, y;
memset(dis, 66, sizeof(dis));
memset(v, 0, sizeof(v));
for (i = 1; i <= 4; i++)//因为可以从这个城市的任意一个机场出发,所以全部丢进去。
q.push({ a[st].po[i], 0.0 }), dis[a[st].po[i]] = 0;//不知道为什么如果我前面加上结构体类型,VS就不能编译,用C++11的特性才行
while (!q.empty())
{
x = q.top().x;
q.pop();
if (v[x])
continue;
v[x] = 1;
for (i = fi[x]; i; i = ne[i])
if (dis[y = di[i]] > dis[x] + da[i])
{
dis[y] = dis[x] + da[i];
q.push({ y, dis[y] });
}
}
double mi = 1e9;
for (i = 1; i < 5; i++)
mi = minn(mi, dis[a[ed].po[i]]);//取min
return mi;
}
int main()
{
int i, j, t, n, p;
t = re();
while (t--)
{
memset(fi, 0, sizeof(fi));
n = re(); m = re(); st = re(); ed = re();
l = p = 0;
for (i = 1; i <= n; i++)
{
for (j = 1; j < 4; j++)
a[i].x[j] = re(), a[i].y[j] = re(), a[i].po[j] = ++p;
a[i].z = re();
int k = fin(i);
a[i].x[4] = a[i].x[1] + a[i].x[2] + a[i].x[3] - (a[i].x[k] << 1);//计算第四个点的坐标
a[i].y[4] = a[i].y[1] + a[i].y[2] + a[i].y[3] - (a[i].y[k] << 1);
a[i].po[4] = ++p;
for (j = 1; j < 4; j++)
add(a[i].po[4], a[i].po[j], calc(a[i].x[4], a[i].y[4], a[i].x[j], a[i].y[j], a[i].z));
}
for (i = 1; i < n; i++)
for (j = i + 1; j <= n; j++)
addp(i, j);
printf("%.1f\n", dij());
}
return 0;
}

洛谷1027 Car的旅行路线的更多相关文章

  1. 洛谷P1027 Car的旅行路线

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

  2. 洛谷 P1027 Car的旅行路线

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

  3. 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...

  4. 洛谷——P1027 Car的旅行路线

    https://www.luogu.org/problem/show?pid=1027#sub 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于 ...

  5. [NOIP2001] 提高组 洛谷P1027 Car的旅行路线

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

  6. DP【洛谷P2134】 百日旅行

    [洛谷P2134] 百日旅行 题目背景 重要的不是去哪里,而是和你在一起.--小红 对小明和小红来说,2014年7月29日是一个美好的日子.这一天是他们相识100天的纪念日. (小明:小红,感谢你2场 ...

  7. BZOJ1880或洛谷2149 [SDOI2009]Elaxia的路线

    BZOJ原题链接 洛谷原题链接 显然最长公共路径是最短路上的一条链. 我们可以把最短路经过的边看成有向边,那么组成的图就是一张\(DAG\),这样题目要求的即是两张\(DAG\)重合部分中的最长链. ...

  8. 洛谷 P2149 [SDOI2009]Elaxia的路线 解题报告

    P2149 [SDOI2009]Elaxia的路线 题目描述 最近,Elaxia和w**的关系特别好,他们很想整天在一起,但是大学的学习太紧张了,他们 必须合理地安排两个人在一起的时间. Elaxia ...

  9. 洛谷P1522 牛的旅行 Cow Tours

    ---恢复内容开始--- P1522 牛的旅行 Cow Tours189通过502提交题目提供者该用户不存在标签 图论 USACO难度 提高+/省选-提交该题 讨论 题解 记录 最新讨论 输出格式题目 ...

随机推荐

  1. VUE插件总结

    亲们支持我的新博客哦==>地址(以后更新会尽量在新博客更新,欢迎大家访问加入我的后宫w) ) UI组件 element - 饿了么出品的Vue2的web UI工具套件 Vux - 基于Vue和W ...

  2. Python全栈开发记录_第四篇(集合、函数等知识点)

    知识点1:深拷贝和浅拷贝 非拷贝(=赋值:数据完全共享,内存地址一样,修改一个另一个也变化) 浅拷贝:数据半共享(复制其数据独立内存存放,但是只拷贝成功第一层)像[[1,2],3,4]如果修改列表中列 ...

  3. Centos7.3 编译安装GDAL以及Python的GDAL包

    参考: https://cryolite.iteye.com/blog/176382 https://blog.csdn.net/a13326021319/article/details/782505 ...

  4. .Net导出pdf文件,C#实现pdf导出 转载 http://www.cnblogs.com/hmYao/p/5842958.html

    导出pdf文件. 在编码前需要在网上下载个itextsharp.dll,此程序集是必备的.楼主下载的是5.0版本,之前下了个5.4的似乎不好用. 下载之后直接添加引用. <%@ Page Lan ...

  5. mycat数据中间件、nginx

      MyCat & Nginx  课程目标 目标1:理解MyCat分片,能够配置MyCat分片 目标2:掌握Nginx的安装与静态网站部署 目标3:掌握Nginx的静态网站部署 目标4:理解N ...

  6. c语言小项目---通讯录2.0

    自从上次通讯录项目被字符串项目整的自闭了之后,用了5天时间重新整理了一下通讯录的思路,并且能够正常的使用,今天按模块把基于链表的通讯录2.0版本记录一下,供后续积累经验. 首先总结一下 通讯录2.0版 ...

  7. MATLAB 出一张好看的图

    1.坐标轴的视点(viewpoint):从哪个方向看整个坐标系统,这决定了坐标轴的方向和位置,通过view函数实现视点的设置:view([z y ]):(将坐标系统想象为一座房子,而自己是个会飞的天使 ...

  8. css样式基础详解

    一.字体属性:(font) 1.大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX.PD 2.样式 {font-styl ...

  9. 剑指offer——包含min函数的栈

    题目:定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度为O(1)) 该题是自己第一次采用编程的方式来实现Java中栈的功能,故直接借鉴了大牛的代码 import ...

  10. centos7 根分区扩容

    系统安装时候使用的默认分区,根分区只分了50G,使用的是LVM 想把home分区分出来660G给根分区 先查了点资料开搞 由于xfs分区只支持增大,不支持缩小,所以home目前是xfs格式无法进行缩小 ...