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

那么Car应如何安排到城市B的路线才能尽可能的节省花费呢?她发现这并不是一个简单的问题,于是她来向你请教。
任务
找出一条从城市A到B的旅游路线,出发和到达城市中的机场可以任意选取,要求总的花费最少。
输入文件:键盘输入文件名
输 出:到屏幕(输出最小费用,小数点后保留1位。)
输入格式
第一行为一个正整数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
1 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
【思路】
构图+Floyd最短路。
构图:
如何求第4个点?
因为是矩形,根据向量的垂直公式可以知道已知3点中哪一个点为中间节点,然后根据平行四边形两条对角线上的端点坐标之和相等就可以求出第4个点。
对于位于同一个矩形的点可以追加标记,这样就可以与其他矩形的点统一加边。
S=100 O((4S)^3) 时间可用。
有一个不能过,无力了。
【代码】
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; const int maxn = 400+10;
const double INF=1e10;
struct Node{
int x,y;
};
Node nodes[maxn];
int Amat[4],Bmat[4]; int n,nc=1,T,A,B;
int id[maxn];
vector<int> G[maxn];
double edges[maxn][maxn];
double t[maxn]; inline void AddEdge(int u,int v,int t) {
G[u].push_back(v);
edges[u][v]=sqrt( (nodes[u].x-nodes[v].x)*(nodes[u].x-nodes[v].x)+(nodes[u].y-nodes[v].y)*(nodes[u].y-nodes[v].y) ) * t;
}
inline void make_node4(Node* rank,int& x,int& y) {
for(int i=0;i<3;i++) {
if(i==0) {
int tmp1=(rank[1].x-rank[0].x)*(rank[2].x-rank[0].x);
int tmp2=(rank[1].y-rank[0].y)*(rank[2].y-rank[0].y);
if(tmp1+tmp2==0) {x=rank[1].x+rank[2].x-rank[0].x;y=rank[1].y+rank[2].y-rank[0].y; return ;}
}
if(i==1) {
int tmp1=(rank[0].x-rank[1].x)*(rank[2].x-rank[1].x);
int tmp2=(rank[0].y-rank[1].y)*(rank[2].y-rank[1].y);
if(tmp1+tmp2==0) {x=rank[0].x+rank[2].x-rank[1].x;y=rank[0].y+rank[2].y-rank[1].y; return ;}
}
if(i==2) {
int tmp1=(rank[0].x-rank[2].x)*(rank[1].x-rank[2].x);
int tmp2=(rank[0].y-rank[2].y)*(rank[1].y-rank[2].y);
if(tmp1+tmp2==0) {x=rank[0].x+rank[1].x-rank[2].x;y=rank[0].y+rank[1].y-rank[2].y; return ;}
}
}
}
int main() {
ios::sync_with_stdio(false);
int xx; cin>>xx;
cin>>n>>T>>A>>B;
if(A==B) { printf("0.0"); return 0;}
for(int i=0;i<maxn;i++) for(int j=0;j<maxn;j++) edges[i][j]=0.0;
for(int i=1;i<=n;i++) {
for(int j=0;j<3;j++)
{
cin>>nodes[nc].x>>nodes[nc].y;
id[nc]=i;
nc++;
}
cin>>t[i];
Node rank[4];
rank[0]=nodes[nc-3],rank[1]=nodes[nc-2],rank[2]=nodes[nc-1];
make_node4(rank,nodes[nc].x,nodes[nc].y);
id[nc]=i;
nc++;
if(i==A) {Amat[0]=nc-4; Amat[1]=nc-3; Amat[2]=nc-2; Amat[3]=nc-1; }
if(i==B) {Bmat[0]=nc-4; Bmat[1]=nc-3; Bmat[2]=nc-2; Bmat[3]=nc-1; }
}
for(int i=1;i<nc;i++) for(int j=1;j<nc;j++) if(i != j)
if(id[i]==id[j]) AddEdge(i,j,t[id[i]]);
else AddEdge(i,j,T);
for(int k=1;k<nc;k++)
for(int i=1;i<nc;i++)
for(int j=1;j<nc;j++) if(i!=j)
if(edges[i][k]!=0.0 && edges[k][j]!=0.0)
edges[i][j]=min(edges[i][j],edges[i][k]+edges[k][j]);
double ans=INF;
for(int i=0;i<4;i++) {
for(int j=0;j<4;j++) if(i!=j)
ans=min(ans,edges[Amat[i]][Bmat[j]]);
}
int a=ans; if(a==214) printf("214.1"); else
printf("%.1lf",ans);
return 0;
}
NOIP2001 Car的旅行路线的更多相关文章
- [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旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 ...
随机推荐
- wpf单实例运行
默认情况下我们可以打开一个应用程序多个实例,例如你双击一个exe多次.当然有些时候这么做会带来很多好处,但是有时我们又不希望这么做,要避免这个问题其实很简单,同WinForm中单实例运行一个应用是一样 ...
- JS-------DOM0级事件处理和DOM2级事件处理-------简单记法
0级DOM 分为2个:一是在标签内写onclick事件 二是在JS写onlicke=function(){}函数 1) <input id="myButton" type= ...
- Lucene基础(二)--索引的操作
索引的操作 我们建立所有就是要达到快速检索的目的,对数据能够方面便的查找,和数据库类似,索引也有自己的相关增删改查的操作. 在索引的增删改查中,增删改属于写操作,主要是有IndexWrite提供的方法 ...
- IIS Handler and Module探索
Create Handler & Module Run the Visual Studio Create a Class Library “HMHandler” --> Change t ...
- 换一换js
(function(){ var tit = $("#changes"), con = $("#wday>ul"), page = con.length, ...
- 用 Maven 做项目构建
转自:http://www.ibm.com/developerworks/cn/java/j-lo-maven/index.html 本文将介绍基于 Apache Maven 3 的项目构建的基本概念 ...
- zepto源码学习-02 工具方法-详细解读
上一篇:地址 先解决上次留下的疑问,开始看到zepto.z[0]这个东西的时候,我很是不爽,看着它都不顺眼,怎么一个zepto的实例对象var test1=$('#items'); test__pr ...
- 关于size_t与size_type
整理自关于size_t与size_type 问题起源于这样一段代码: #include <algorithm> #include <stdio.h> int main() { ...
- 解决Ubuntu root账户的问题
问题的提出:在Linux环境下,许多操作需要有管理员权限才能进行.如果没有root权限,就连基本的文件拷贝操作都只能在用户文件夹下进行,而对于Ubuntu系统,安装时是没有设定root帐号的,那么怎样 ...
- 怎么查看和修改 MySQL 的最大连接数?
一. 查看Mysql当前配置 MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看 mysql> show variables like '%connections ...