NC16697 [NOIP2001]Car的旅行路线
题目
题目描述
又到暑假了,住在城市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的旅行路线的更多相关文章
- NOIP2001 Car的旅行路线
题四 Car的旅行路线(30分) 问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...
- GDOI2015小Z的旅行路线
GDOI2015小Z的旅行路线 题意: \(n\)个点的无根树,边上有权值. \(q\)个询问\(s\)和\(s\),问从\(s\)出发,找一条最长路(不经过重复点),保证路径上所有边边权不超过\(x ...
- 【Foreign】旅行路线 [倍增]
旅行路线 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 3 2 ...
- 洛谷P1027 Car的旅行路线
洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- 洛谷 P1027 Car的旅行路线
P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...
- AC日记——Car的旅行路线 洛谷 P1027
Car的旅行路线 思路: 这题不难,就是有点恶心: 而且,请认真读题目(就是题目卡死劳资): 来,上代码: #include <cmath> #include <cstdio> ...
- P1027 car的旅行路线
car的旅行路线 洛谷链接 这个题关键就是 如何把每个点表示出来,其实求出四个点的坐标后,只需要把这些点连接起来,用一遍folyed求出最短路径就好了. 代码: #include<cmath&g ...
- 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法
目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...
- Car的旅行路线 luogu P1027 (Floyd玄学Bug有点毒瘤)
luogu题目传送门! Car的旅行路线 问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 ...
随机推荐
- 每天学五分钟 Liunx 001 | 用户及用户组
Liunx 文件权限 [root@controller-0 ~]# ll -al heihei -rw-r--r--. 1 root root 0 Mar 3 07:39 heihei 第一列 -rw ...
- 在Vue中可以使用方括号法获得想要的对象数据吗?
1.问题 Document {{message}} {{school.name}}{{school[mobile]}} 在这里 {{school.name}}{{school[mobile]}} 不可 ...
- Linux复习笔记
Linux复习笔记 常识说明 目录结构 Linux以树型结构管理文件,其最上层文件夹为 / ,也就是根目录. 如图所示,图中展示了一部分文件夹的结构: 所有的文件夹都属于根目录的子文件夹. 安装好系统 ...
- [转帖]被误解的CPU利用率、超线程、动态调频 —— CPU 性能之迷 Part 1
https://blog.mygraphql.com/zh/notes/hw/hyper-threading/ 引 性能测试.压力测试.业务系统性能容量评估.这 3 件事,可以认为是大部分程序员/软件 ...
- [转帖]Shell脚本数组(实现冒泡排序,直接选择排序,反转排序)
目录 数组 数组定义方法 数组包括的数据类型 获取数组长度 读取某下标赋值 数组遍历 数组切片 数组替换 删除数组 追加数组中的元素 从函数返回数组 加法传参运算 乘法传参运算 数组排序算法 冒泡排序 ...
- [转帖]mysql8.0的RPM方式安装
https://www.cnblogs.com/asker009/p/15072354.html 1. 下载 https://dev.mysql.com/downloads/ 使用wget下载yum的 ...
- 【转帖】【性能提升神器】STRAIGHT_JOIN
今天给大家下另一个性能提升神器-STRAIGHT_JOIN,在数据量大的联表查询中灵活运用的话,能大大缩短查询时间. 首先来解释下STRAIGHT_JOIN到底是用做什么的: STRAIGHT_JOI ...
- [转帖]ELKStack入门篇(二)之Nginx、Tomcat、Java日志收集以及TCP收集日志使用
https://www.cnblogs.com/linuxk/p/9273160.html 1.收集Nginx的json格式日志 1.1.Nginx安装 1.2.配置logstash [root@ ...
- [转帖]Linux下strace调试系统应用参数总结(附实例操作讲解)
文章目录 一.简介 二.常用参数详解 三.实例详解 3.1 跟踪具体进程 3.2 监控具体程序执行过程 四.其他相关知识链接 一.简介 strace命令是一个集诊断.调试.统计与一体的Linux 用户 ...
- [转帖]Spring Cloud Alibaba Nacos 注册中心使用教程
一. 什么是Nacos Nacos是一个更易于构建云原生应用的动态服务发现(Nacos Discovery ).服务配置(Nacos Config)和服务管理平台,集注册中心+配置中心+服务管理于一身 ...