题目链接

题目

题目描述

又到暑假了,住在城市A的Car想和朋友一起去城市B旅游。她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路,第I个城市中高速铁路了的单位里程价格为Ti,任意两个不同城市的机场之间均有航线,所有航线单位里程的价格均为t。

图例(从上而下)

机场

高速铁路

飞机航线

注意:图中并没有标出所有的铁路与航线。

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。

任务:找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

输入描述

第一行为一个正整数n( 0 ≤ n ≤ 10 ),表示有n组测试数据。

每组的第一行有4个正整数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个城市中任意3个机场的坐标,Ti 为第i个城市高速铁路单位里程的价格。

输出描述

共有n行,每行1个数据对应测试数据(最小花费)。保留一位小数。

示例1

输入

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

题解

知识点:计算几何,最短路。

难点在建图,具体看代码。

时间复杂度 \(O(s^2 \log s)\)

空间复杂度 \(O(s^2)\)

代码

#include <bits/stdc++.h>
#define ll long long using namespace std; template<class T>
struct Graph {
struct edge {
int v, nxt;
T w;
};
int idx;
vector<int> h;
vector<edge> e; Graph(int n, int m) :idx(0), h(n + 1), e(m + 1) {}
void init(int n) {
idx = 0;
h.assign(n + 1, 0);
} void add(int u, int v, T w) {
e[++idx] = edge{ v,h[u],w };
h[u] = idx;
}
}; const int N = 107 * 4, M = N * N * 2;
Graph<double> g(N, M);
int s; struct Point {
double x, y;
}; double dot(Point A, Point B) {
return A.x * B.x + A.y * B.y;
} double dist(Point A, Point B) {
return sqrt((A.x - B.x) * (A.x - B.x) + (A.y - B.y) * (A.y - B.y));
} double dis[N];
bool vis[N];
struct node {
int v;
double w;
friend bool operator<(const node &a, const node &b) {
return a.w > b.w;
}
};
priority_queue<node> pq;
void dijkstra(int st) {
for (int i = 1;i <= s * 4 + 2;i++) dis[i] = 0x3f3f3f3f, vis[i] = 0;
dis[st] = 0;
pq.push({ st,0 });
while (!pq.empty()) {
int u = pq.top().v;
pq.pop();
if (vis[u]) continue;
vis[u] = 1;
for (int i = g.h[u];i;i = g.e[i].nxt) {
int v = g.e[i].v;
double w = g.e[i].w;
if (dis[v] > dis[u] + w) {
dis[v] = dis[u] + w;
pq.push({ v,dis[v] });
}
}
}
} int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n;
cin >> n;
while (n--) {
int t, A, B;
cin >> s >> t >> A >> B;
g.init(s * 4 + 2);
vector<vector<Point>> v(s + 1, vector<Point>(4));
for (int i = 1;i <= s;i++) {
int T;
for (int j = 0;j < 3;j++) cin >> v[i][j].x >> v[i][j].y;
cin >> T;
for (int j = 0;j < 3;j++) {
if (dot({ v[i][j].x - v[i][(j + 1) % 3].x ,v[i][j].y - v[i][(j + 1) % 3].y }, { v[i][j].x - v[i][(j + 2) % 3].x ,v[i][j].y - v[i][(j + 2) % 3].y }) == 0) {
v[i][3].x = v[i][(j + 1) % 3].x + v[i][(j + 2) % 3].x - v[i][j].x;
v[i][3].y = v[i][(j + 1) % 3].y + v[i][(j + 2) % 3].y - v[i][j].y;
break;
}
}
for (int j = 0;j < 4;j++) {
for (int k = j + 1;k < 4;k++) {
double d = dist(v[i][j], v[i][k]);
g.add(j + 1 + 4 * (i - 1), k + 1 + 4 * (i - 1), d * T);
g.add(k + 1 + 4 * (i - 1), j + 1 + 4 * (i - 1), d * T);
}
}
}
for (int i = 1;i <= s;i++) {
for (int j = 0;j < 4;j++) {
for (int k = i + 1;k <= s;k++) {
for (int l = 0;l < 4;l++) {
double d = dist(v[i][j], v[k][l]);
g.add(j + 1 + 4 * (i - 1), l + 1 + 4 * (k - 1), d * t);
g.add(l + 1 + 4 * (k - 1), j + 1 + 4 * (i - 1), d * t);
}
}
}
}
for (int i = 0;i < 4;i++) g.add(s * 4 + 1, i + 1 + (A - 1) * 4, 0);
for (int i = 0;i < 4;i++) g.add(i + 1 + (B - 1) * 4, s * 4 + 2, 0);
dijkstra(s * 4 + 1);
cout << fixed << setprecision(1) << dis[s * 4 + 2] << '\n';
}
return 0;
}

NC16697 [NOIP2001]Car的旅行路线的更多相关文章

  1. NOIP2001 Car的旅行路线

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

  2. [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)

    最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...

  3. GDOI2015小Z的旅行路线

    GDOI2015小Z的旅行路线 题意: \(n\)个点的无根树,边上有权值. \(q\)个询问\(s\)和\(s\),问从\(s\)出发,找一条最长路(不经过重复点),保证路径上所有边边权不超过\(x ...

  4. 【Foreign】旅行路线 [倍增]

    旅行路线 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 3 2 ...

  5. 洛谷P1027 Car的旅行路线

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

  6. 洛谷 P1027 Car的旅行路线

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

  7. AC日记——Car的旅行路线 洛谷 P1027

    Car的旅行路线 思路: 这题不难,就是有点恶心: 而且,请认真读题目(就是题目卡死劳资): 来,上代码: #include <cmath> #include <cstdio> ...

  8. P1027 car的旅行路线

    car的旅行路线 洛谷链接 这个题关键就是 如何把每个点表示出来,其实求出四个点的坐标后,只需要把这些点连接起来,用一遍folyed求出最短路径就好了. 代码: #include<cmath&g ...

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

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

  10. Car的旅行路线 luogu P1027 (Floyd玄学Bug有点毒瘤)

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

随机推荐

  1. 每天学五分钟 Liunx 0100 | 服务篇:进程状态

    多任务和 CPU 时间片 前面说了 Liunx 是多用户多任务的,所谓的多任务就是多个进程"同时"执行.比如,同时开多个软件(进程),对于用户来说好像每个软件(进程)都在工作,但是 ...

  2. C# WPF:快把文件从桌面拖进我的窗体来!

    首发公众号:Dotnet9 作者:沙漠之尽头的狼 日期:202-11-27 一.本文开始之前 上传文件时,一般是提供一个上传按钮,点击上传,弹出文件(或者目录选择对话框),选择文件(或者目录)后,从对 ...

  3. 配置Maven项目的pom.xml时遇到input contained no data问题

    1.问题 2.解决 我发现每次当我修改一些部分之后,就会遇到这个问题 我遵循了他的建议重新排列标记属性,然后重新加载就解决了报错 个人怀疑是修改后并没有识别之类的? 最终原因:是我在Maven项目中的 ...

  4. 如何看待《李跳跳》APP因被腾讯公司发律师函称“不正当竞争”而无限期停止更新?

    一波未平一波又起,继李跳跳无限期停更后,又一安卓神奇工具被下发律师函!近期各路安卓工具APP,被某讯大厂可谓是尽数剿灭~ 不难看出此次行动是"蓄谋已久"了.与李跳跳.大圣净化类似的 ...

  5. 使用阿里canal实现mysql与Elasticsearch增量同步

    一.背景介绍 最近在做一个地理信息相关的项目,需要维护大量的地址描述数据,同时需要提供对数据检索的功能,准备采用Elasticsearch(6.7)实现.那么问题就来了,地址数据需要同时在MySQL和 ...

  6. [转帖]ORACLE 并行(PARALLEL)实现方式及优先级

      http://blog.itpub.net/25542870/viewspace-2120924/ 一.      Parallel query 默认情况下session 是ENABLE状态 1. ...

  7. [转帖]Titan 配置

    https://www.bookstack.cn/read/TiDB-4.0/storage-engine-titan-configuration.md 开启 Titan Titan 对 RocksD ...

  8. [转帖]比较不同CPU下的分支预测

    https://plantegg.github.io/2023/04/16/%E6%AF%94%E8%BE%83%E4%B8%8D%E5%90%8CCPU%E4%B8%8B%E7%9A%84%E5%8 ...

  9. 【转帖】基于paramiko的二次封装

    https://www.jianshu.com/p/944674f44b24 paramiko 是 Python 中的一个用来连接远程主机的第三方工具,通过使用 paramiko 可以用来代替以 ss ...

  10. [转帖]Linux系统awk命令详解

    AWK 是一种处理文本文件的语言,是一个强大的文本分析工具. 之所以叫 AWK 是因为其取了三位创始人 Alfred Aho,Peter Weinberger, 和 Brian Kernighan 的 ...