https://www.luogu.org/problem/P1027

题目描述

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

图例(从上而下)

机场
高速铁路
飞机航线

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

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

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

输入格式

第一行有4个正整数s,t,A,B。

S(0<S≤100)表示城市的个数,tt表示飞机单位里程的价格,A,B分别为城市A,B的序号,(1≤A,B≤S)。

接下来有S行,其中第I行均有7个正整数xi1​,yi1​,xi2​,yi2​,xi3​,yi3​,Ti,这当中的(xi1​,yi1​),(xi2​,yi2​),(xi3​,yi3​)分别是第ii个城市中任意33个机场的坐标,TiTi为第ii个城市高速铁路单位里程的价格。

输出格式

共1个数据对应测试数据。 保留一位小数。

输入输出样例

输入

输出
47.5

本题我们不妨把每个城市的4个机场看做四个点。那样这图就有4×s 个点。

根据题目描述,我们又知道:每一个机场都与另外每一个机场互通,差别只是在是否是同一个城市:

如果是,那么只能走高速铁路;

如果不是,那么只能走航道。用一个判断来计算这条路的花费即可。

最后跑最短路,答案为到达城市的4个机场的花费的最小值。

 #include <stdio.h>
#include <string.h>
#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#include <sstream>
const int INF=0x3f3f3f3f;
typedef long long LL;
const int mod=1e9+;
//const double PI=acos(-1);
#define Bug cout<<"---------------------"<<endl
const int maxn=1e5+;
using namespace std; int n,A,B;
double cost; struct node
{
int x, y;
int city;
}; node PT[];
node APT[maxn];
int cntt; struct Edge_node
{
int to;
int next;
double cost;
}Edge[<<]; int head[];
int cnt;
double dis[];
int ctcost[maxn]; struct cmp1
{
bool operator()(int x,int y)
{
return dis[x]>dis[y];
}
}; void add_edge(int u,int v,double val)
{
Edge[cnt].to=v;
Edge[cnt].cost=val;
Edge[cnt].next=head[u];
head[u]=cnt++;
} double juli(int x1, int y1, int x2, int y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} void Dijkstra()
{
fill(dis+,dis++cntt,INF);
priority_queue<int,vector<int>,cmp1 > qe;
for(int i=A*-;i<=A*;i++)
{
dis[i]=;
qe.push(i);
}
while(!qe.empty())
{
int u=qe.top();
qe.pop();
for(int i=head[u];i!=-;i=Edge[i].next)
{
int v=Edge[i].to;
if(dis[u]+Edge[i].cost<dis[v])
{
dis[v]=dis[u]+Edge[i].cost;
qe.push(v);
}
}
}
} int main()
{
cnt=cntt=;
memset(head,-,sizeof(head));
scanf("%d %lf %d %d",&n,&cost,&A,&B);
for(int i=;i<=n;i++)
{
scanf("%d %d %d %d %d %d %d",&PT[].x,&PT[].y,&PT[].x,&PT[].y,&PT[].x,&PT[].y,&ctcost[i]);
while((PT[].x-PT[].x)*(PT[].x-PT[].x)!=(PT[].y-PT[].y)*(PT[].y-PT[].y))
{
node t=PT[];
PT[]=PT[];PT[]=PT[];PT[]=t;
}
PT[].x=PT[].x+(PT[].x-PT[].x);//求出最后一个点
PT[].y=PT[].y+(PT[].y-PT[].y);
for(int k=;k<;k++)
{
PT[k].city=i;
APT[++cntt]=PT[k];
}
}
for(int i=;i<=cntt;i++)//计算每两个点之间的费用
{
for(int j=i+;j<=cntt;j++)
{
double val;
if(APT[i].city==APT[j].city)
val=juli(APT[i].x,APT[i].y,APT[j].x,APT[j].y)*ctcost[APT[i].city];
else val=juli(APT[i].x,APT[i].y,APT[j].x,APT[j].y)*cost;
add_edge(i,j,val);
add_edge(j,i,val);
}
}
Dijkstra();//我竟然忘写这个了。。。
double ans=INF;
for(int i=B*-;i<=B*;i++)
{
if(ans>dis[i])
ans=dis[i];
}
printf("%.1f\n",ans);
return ;
}

蓝桥杯 Car的旅行路线 (预处理+最短路径)的更多相关文章

  1. Java实现 蓝桥杯VIP 算法训练 Car的旅行路线

    大家可以看一下这个,蓝桥杯官网的这道题是有问题的 Car的旅行路线 算法训练 Car的旅行路线 时间限制:1.0s 内存限制:256.0MB 提交此题 锦囊1 锦囊2 查看参考代码 问题描述 又到暑假 ...

  2. 第四届蓝桥杯 c/c++真题

    第四届蓝桥杯 c/c++真题 <1>高斯日记 问题 大数学家高斯有个好习惯:无论如何都要记日记. 他的日记有个与众不同的地方,他从不注明年月日,而是用一个整数代替,比如:4210 后来人们 ...

  3. 算法笔记_107:蓝桥杯练习 算法提高 学霸的迷宫(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 学霸抢走了大家的作业,班长为了帮同学们找回作业,决定去找学霸决斗.但学霸为了不要别人打扰,住在一个城堡里,城堡外面是一个二维的格子迷宫,要 ...

  4. 蓝桥杯历届试题 地宫取宝 dp or 记忆化搜索

    问题描述 X 国王有一个地宫宝库.是 n x m 个格子的矩阵.每个格子放一件宝贝.每个宝贝贴着价值标签. 地宫的入口在左上角,出口在右下角. 小明被带到地宫的入口,国王要求他只能向右或向下行走. 走 ...

  5. 蓝桥杯---剪格子(DFS&BFS)(小总结)

    问题描述 如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+ ...

  6. 52-2018 蓝桥杯省赛 B 组模拟赛(一)java

    最近蒜头君喜欢上了U型数字,所谓U型数字,就是这个数字的每一位先严格单调递减,后严格单调递增.比如 212212 就是一个U型数字,但是 333333, 9898, 567567, 313133131 ...

  7. 算法笔记_212:第七届蓝桥杯软件类决赛真题(Java语言B组)

    目录 1 愤怒小鸟 2 反幻方 3 打靶 4 路径之谜 5 碱基 6 圆圈舞 前言:以下代码仅供参考,若有错误欢迎指正哦~ 1 愤怒小鸟 愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车 ...

  8. 2019第十届蓝桥杯C/C++

    这是我第一次参加蓝桥杯比赛,比完后,有点低于预期,自己的发挥低于预期,赛事水准也低于预期. 教室里面很多同学的电脑出现问题,举办学校也没有完善的应急方案,有一部分同学11点钟才可以做题. 附题目pdf ...

  9. java算法 蓝桥杯 文化之旅

    问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

随机推荐

  1. 封装localStorage设置,获取,移除方法

    export const local = { set(key, value) { localStorage.setItem(key, JSON.stringify(value)); }, get(ke ...

  2. Mybatis报错——Mapped Statements collection already contains value for

    解决办法: 看看你的mybatis-config.xml <mappers>     <mapper resource="mapper/SeckillDao.xml&quo ...

  3. Session简单介绍

    Session 会话 , Session是基于Cookie的一种会话机制. Cookie是服务器返回一小份数据给客户端,并且存放在客户端上. Session是,数据存放在服务器端. 常用API //得 ...

  4. IDEA创建新文件时自动生成时间和作者

    打开设置,打开下图的选项并且输入 /** * @author 你的名字 * @date ${DATE} ${TIME} */

  5. mysql四种事务隔离级别

    mysql事务并发问题 ACID什么的就不啰嗦了.mysql多个事务并发的时候,可能会出现如下问题: 1. 更新丢失 即两个事务同时更新某一条数据,后执行的更新操作会覆盖先执行的更新操作,导致先执行的 ...

  6. redis(三)----连接池配置

    1. 目录结构: 2. 测试源码 package com.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.Jed ...

  7. UVA - 1631 Locker(密码锁)(dp---记忆化搜索)

    题意:有一个n(n<=1000)位密码锁,每位都是0~9,可以循环旋转.每次可以让1~3个相邻数字同时往上或者往下转一格.输入初始状态和终止状态(长度不超过1000),问最少要转几次. 分析: ...

  8. 每天一点点之vue框架开发 - 数据渲染-for循环中动态设置页面背景色

    实现方式很简单,在属性前加:,表示绑定 :style="{'background':item.bgColor} 代码样例: <li v-for="item in laber_ ...

  9. UVALive 3983 捡垃圾的机器人 DP

    这个题目我最初的做法沿用树形DP的做法,设置一个 dp[i][0]表示机器人在i点不回去的最短路径,dp[i][1]表示机器人在i点回去的最短路径,规划方向为i-1向i转移,结果发现这个不能用树形的结 ...

  10. SQL基础教程(第2版)第7章 集合运算:7-2 联结(以列为单位对表进行联结)

    第7章 集合运算:7-2 联结(以列为单位对表进行联结) ■联结的特定语法和过时语法 ● 联结( JOIN)就是将其他表中的列添加过来,进行“添加列”的集合运算.UNION是以行(纵向)为单位进行操作 ...