题目链接:https://vijos.org/p/1119

题目描述

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

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。

输入格式

第一行有四个正整数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个城市中任意三个机场的坐标,T I为第I个城市高速铁路单位里程的价格。

输出格式

输出最小费用(结果保留两位小数)

样例输入

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.55

解题思路

这个就是一道最短路问题,关键的就是已知矩形三个点的坐标,求出最后一个点的坐标,只要求出这个,剩下的就好做了,这是本人写的求法:https://blog.csdn.net/lzyws739307453/article/details/85008349

求出四个点的坐标之后,题上说共有S个城市,那么我们可以得到4*S个点(每个城市4个点),然后分别求出一个点到其余各点的花费,城市四个点之间的按高铁的价格算,城市与城市按飞机的价格算,跑一遍最短路,最后求出A城市的四个点分别到B城市的四个点的最小花费,求出最小值即可。

#include <queue>
#include <cmath>
#include <cstdio>
#include <iostream>
using namespace std;
const double inf = 999999999;
typedef struct edge {int x, y;
}coor;
coor e[450];
int vis[410];
double dis[410], map[410][410];
coor coordinate(coor a, coor b, coor c)
{coor p;p.x = b.x + c.x - a.x;p.y = b.y + c.y - a.y;return p;
}
bool Judge(coor a, coor b, coor c)
{if (!((b.x - a.x) * (c.x - a.x) + (b.y - a.y) * (c.y - a.y)))return true;return false;
}
void Seeking(coor a[])
{if (Judge(a[0], a[1], a[2]))a[3] = coordinate(a[0], a[1], a[2]);else if(Judge(a[1], a[0], a[2]))a[3] = coordinate(a[1], a[0], a[2]);else a[3] = coordinate(a[2], a[0], a[1]);
}
void Spfa(int s, int S)
{queue <int> Q;for (int i = 0; i < 4 * S; i++){vis[i] = 0;dis[i] = inf;}Q.push(s);dis[s] = 0;vis[s] = 1;while (!Q.empty()){int u = Q.front();Q.pop();vis[u] = 0;for (int j = 0; j < 4 * S; j++){if (dis[j] > dis[u] + map[u][j]){dis[j] = dis[u] + map[u][j];if (!vis[j]){vis[j] = 1;Q.push(j);}}}}
}
int main()
{coor a, b;int S, T, A, B, TT[410];while (~scanf("%d%d%d%d", &S, &T, &A, &B)){double minn = inf;for (int i = 0; i < 4 * S; i++)for (int j = 0; j < 4 * S; j++)map[i][j] = inf;for (int i = 0; i < 4 * S; i += 4){for (int j = 0; j < 3; j++)scanf("%d%d", &e[i + j].x, &e[i + j].y);scanf("%d", &TT[i]);Seeking(e + i);}for (int i = 0; i < 4 * S; i += 4){for (int j = 0; j < 4; j++){a = e[i + j];for (int k = i + j + 1; k < i + 4; k++){b = e[k];map[k][i + j] = map[i + j][k] = TT[i] * sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}for (int k = i + 4; k < 4 * S; k++){b = e[k];map[k][i + j] = map[i + j][k] = T * sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));}}}for (int i = 0; i < 4; i++){int u = (A - 1) * 4 + i;Spfa(u, S);for (int j = 0; j < 4; j++){int v = (B - 1) * 4 + j;if (minn > dis[v])minn = dis[v];}}printf("%.2lf\n", minn);}return 0;
}

Vijos - Car的旅行路线(最短路)相关推荐

  1. 【codevs1041NOIP01TG】Car的旅行路线,最短路中的数学题

    Car的旅行路线 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 又到暑假了,住在城市A的Car想和朋友一 ...

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

    原题链接:[NOIP2001 提高组] Car 的旅行路线 - 洛谷 AC代码: #include<bits/stdc++.h> using namespace std; #define ...

  3. 旅游路线最短matlab,动态规划求最短旅行路线.doc

    动态规划求最短旅行路线.doc 动态规划求最短旅行路线摘要在我们日常生活和旅行中经常遇到求最短路径的问题,将动态规划思想运用到求解旅行问题最短路径中,将过程划分为几个阶段,在每阶段中选取最优策略,最后 ...

  4. 洛谷 P1027 Car的旅行路线

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

  5. 【离散数学】实验 旅行路线规划问题

    实验要求 实验目的:加深图的汉密尔顿路及最短路径的理解与应用 实验内容:搜索某旅游城市地图(至少包含10个景点),随机选取出发地点,基于图论理论建立模型,给出合理的旅行路线.要求考虑时间.成本等因素. ...

  6. AI 旅行工具大盘点!31 款 AI 旅行行程规划工具,一键规划旅行路线!

    0. 未来百科 未来百科(https://nav.6aiq.com),是一个知名的AI产品导航网站 -- 为发现全球优质AI工具而生 .目前已 聚集全球3000+优质AI工具产品 ,旨在帮助用户发现全 ...

  7. 简单的基于地理图片的旅行路线还原

    在学校时关注基于地理信息的数据挖掘已久,毕业后几无涉足.本文小结当时的一些工作--基于带地理信息的图片的旅行路线还原,也就是通过人们分享的少量图片,还原出用户旅行时的完整的旅行路线.主要方法是先基于H ...

  8. 【wikioi】1041 Car的旅行路线

    题目链接 算法:最短路(数据弱,Floyd也能过) 惨痛的教训:此题我至少提交了20次,原因在于= =太草率和粗心了,看到那个多少组数据以为是城市的数量,导致数组开得小小的= =.(对不起,wikio ...

  9. 洛谷P1027 Car的旅行路线 计算几何 图论最短路

    题意 求某城到某城的最小花费 一个城中有四个机场,一个城中的机场相互可达,用公路到达,但是不同城的公路的单位路程的 费不同,两个不同城的机场(我不知道相同城可不可以)可以通过机场到达,且飞机单位路程价 ...

最新文章

  1. 转载:用 Tomcat 和 Eclipse 开发 Web 应用程序
  2. Go gin其他数据类型渲染
  3. Arduino--AS608指纹传感器
  4. SurfaceViewDemo
  5. 《C++ Primer》13.1.4节练习
  6. 随机数生成java代码_Java Bullshifier –生成大量随机代码库
  7. gpgga格式读取MATLAB,GPS编码格式及读取.doc
  8. Leetcode题目:Valid Anagram
  9. 10kv电压互感器型号_电流互感器结构及原理
  10. 大数据学习笔记29:Hadoop压缩机制演示
  11. Live Meeting 音频视频使用端口设置
  12. Spark团队开源新项目MLflow发布0.2版本,内置TensorFlow集成
  13. efs文件解密软件_免费数据恢复软件排行榜Top10!
  14. Win7允许/禁用 PING命令
  15. x86汇编指令集大全注释(二)
  16. 1299: Problem 1
  17. mysql datesub interval_Mysql之INTERVAL与DATE_SUB与EXTRACT函数的使用
  18. NUnit的入门学习
  19. 会议论文与期刊论文的写作差异
  20. html字体下划线取消,取消下划线与显示下划线设置

热门文章

  1. js赋值后 改变现有数据会修改原来的数据的解决办法
  2. 一站式学习Java网络编程 全面理解BIO_NIO_AIO,学习手记(七)
  3. c语言结构体李云龙张三丰,C语言 有一个错误 求改正
  4. 第六章 Linux 文件与目录配置
  5. vue集成高德地图后 搜索按钮国际化的问题
  6. 云计算中心怎么存储数据?
  7. 3个开源的快速开发平台,前后端都有,项目经验又有着落了!
  8. 苹果cmsv10黑色自适应好看的炫酷简约带会员中心模板
  9. 2019-7-1-VisualStudio-快速设置启动项目
  10. 《绝地求生大逃杀》为什么具有高人气