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

图例(从上而下)
机场 高速铁路
飞机航线
注意:图中并没有
标出所有的铁路与航线。
那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入输出格式
输入格式:
第一行为一个正整数n(0<=n<=10),表示有n组测试数据。
每组的第一行有四个正整数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个城市高速铁路单位里程的价格。
输出格式:
共有n行,每行一个数据对应测试数据。 保留一位小数
输入输出样例
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
题目解析:
这是一道比较裸的最短路问题,首先是建图问题,题目只给了一个城市三个点的坐标,设已知三点坐标为(x1,y1) (x2,y2) (x3,y3),如何求(x4,y4)?
因为这是一个垂直,我们可以想到勾股,向量等方法,但不简便。由于这是个矩形,不难想到对角线中点相等,那么已知的三个点哪两个是对角的点呢?
我们可以通过勾股定理求出三条边,根据边越大,角越大的规则可以求出直角,设为(x3,y3),不难得出:x4=x2+x3-x1;y4=y2+y3-y1;
这样整个图的所有点求出,开始建图。而由于这是个稠密图,我们建议用邻接矩阵(手残用了邻接表)。
从主观上看,我们可以以a城市的四个机场为起点,这样需要跑四次spfa。但是我们可以利用虚点的思想,问题可以转化为从虚点出发到B城市的spfa。
(假设有一个点:0,它到四个起点的dist==0)
而程序中并不需要把虚点建出来连边,只需把四个起点的dist设为0即可;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#define maxn 10001
using namespace std;
int n,s,a,b,u[maxn],v[maxn],fr[maxn],cure,curn,frst[maxn],nst[maxn],que[maxn],head,tail,vis[maxn],T,t[maxn],des,xx[maxn],yy[maxn];
//int ans=0x7ffffff;
float w[maxn],dist[maxn];
int min(int x,int y)
{
return x>y?y:x;
}
void add(int x,int y,float z)
{
u[cure++]=x;v[cure]=y,w[cure]=z;
nst[cure]=frst[x];frst[x]=cure;
}
float dis(int x1,int y1,int x2,int y2)
{
float ans=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return ans;
}
int main()
{
scanf("%d",&n);
for(int timm=;timm<=n;timm++)
{
memset(frst,-,sizeof(frst));
memset(nst,-,sizeof(nst));
memset(u,,sizeof(u));
memset(v,,sizeof(v));
memset(t,,sizeof(t));
memset(w,,sizeof(w));
memset(que,,sizeof(que));
memset(vis,,sizeof(vis));
memset(fr,,sizeof(fr));
memset(xx,,sizeof(xx));
memset(yy,,sizeof(yy));
curn=;cure=;
head=tail=;
scanf("%d%d%d%d",&s,&T,&a,&b);
for(int i=;i<=s;i++)
{
int x1,y1,x2,y2,x3,y3,x4,y4,nodex,nodey;
float e1,e2,e3;
scanf("%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&t[i]);
e1=dis(x2,y2,x3,y3);
e2=dis(x1,y1,x3,y3);
e3=dis(x1,y1,x2,y2);
if(e1>e2&&e1>e3)
{
x4=x2+x3-x1;y4=y2+y3-y1;
}
else if(e2>e1&&e2>e3)
{
x4=x1+x3-x2;y4=y1+y3-y2;
}
else if(e3>e1&&e3>e2)
{
x4=x1+x2-x3;y4=y1+y2-y3;
}
xx[++curn]=x1;yy[curn]=y1;fr[curn]=i;
xx[++curn]=x2;yy[curn]=y2;fr[curn]=i;
xx[++curn]=x3;yy[curn]=y3;fr[curn]=i;
xx[++curn]=x4;yy[curn]=y4;fr[curn]=i;
}
for(int j=;j<=curn;j++)
for(int k=;k<=curn;k++)
{
if(j==k)
continue;
if(fr[j]==fr[k])
{
if(fr[j]==a||fr[j]==b)
{
add(j,k,);
if(fr[j]==b)
des=j;
}
else
{
float fee=dis(xx[j],yy[j],xx[k],yy[k])*t[fr[j]];
add(j,k,fee);
}
}
else
{
float fee=dis(xx[j],yy[j],xx[k],yy[k])*T;
add(j,k,fee);
}
}
for(int j=;j<=curn;j++)
{
dist[j]=0x7fffffff;
if(fr[j]==a)
{
dist[j]=;
que[tail]=j;
}
}
tail++;
while(head<tail)
{
int node=que[head];
head++;
if(fr[node]!=a) vis[node]=;
for(int ed=frst[node];ed!=-;ed=nst[ed])
{
int to=v[ed];
if(dist[to]>dist[node]+w[ed])
{
dist[to]=dist[node]+w[ed];
if(!vis[to])
{
vis[to]=;
que[tail++]=to;
}
}
if(fr[to]==a&&!vis[to])
{
vis[to]=;
que[tail++]=to;
}
}
}
printf("%0.1f\n",dist[des]);
}
return ;
}
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旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 ...
随机推荐
- egret中场景跳转的动画
原理:创建一个截取当前场景的截图然后对截图进行bitmap处理加上tween.优点:无需任何图片,特效!适用于任何场景! //1.卷帘特效 //2.左右切换移动 //3.直接翻 //4.旋转掉落 // ...
- @Autowired注解与@Qualifier注解搭配使用
问题:当一个接口实现由两个实现类时,只使用@Autowired注解,会报错,如下图所示 实现类1 实现类2 controller中注入 然后启动服务报错,如下所示: Exception encount ...
- Git 工具 - 储藏(Stashing)
储藏(Stashing) 经常有这样的事情发生,当你正在进行项目中某一部分的工作,里面的东西处于一个比较杂乱的状态,而你想转到其他分支上进行一些工作.问题是,你不想提交进行了一半的工作,否则以后你无法 ...
- 开通blog,记录学习历程
2017.12.15日,开通blog,用于回忆知识点的记录和整理. 开通本blog主要做以下几点事情: 1.巩固知识点,基础打牢: 2.在基础牢固的基础上,学习流行的框架: 3.在框架牢固的基础上学习 ...
- python中下划线的特殊用法
python下划线用法总结: ① _XXX 不能用于“ from model import * ”的导入: ②__XXX__ 系统定义名字: ③__XXX 类中的私有变量名. 总结:避免随意用下划线 ...
- JavaWeb基础-Jsp内置对象
request对象 客户端的请求信息被封装在request对象中,通过它才能了解到客户的需求,然后做出响应,它是HttpServlteRequest类的实例.Request对象具有请求域,即完成客户端 ...
- 目标检测(一) R-CNN
R-CNN全称为 Region-CNN,它是第一个成功地将深度学习应用到目标检测的算法,后续的改进算法 Fast R-CNN.Faster R-CNN都是基于该算法. 传统方法 VS R-CNN 传统 ...
- 使用IdentityServer4,在一个ASPNetCore项目中,配置oidc和api的AccessToken两种认证授权
1.配置两种认证方式 JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); services.AddAuthentication(op ...
- 搭建项目(Vue学习笔记一)
一.在搭建Vue项目之前首先要搞明白以下几个问题 1.Vue.js是什么 vue.js是一个脚本库. 2.webpack 模块打包机,分析项目结构,找到JavaScript模块以及其他的一些浏览器不能 ...
- 推理机Jess,Racer,Jena
推理机 Jess(Java Expert Shell System)是基于Java语言的CLISP推理机. CLISP是基于产生式的前向推理引擎,许多上层的推理任务,都要映射到这个推理引擎上来运行. ...