题四 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的旅行路线的更多相关文章

  1. [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)

    最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...

  2. GDOI2015小Z的旅行路线

    GDOI2015小Z的旅行路线 题意: \(n\)个点的无根树,边上有权值. \(q\)个询问\(s\)和\(s\),问从\(s\)出发,找一条最长路(不经过重复点),保证路径上所有边边权不超过\(x ...

  3. 【Foreign】旅行路线 [倍增]

    旅行路线 Time Limit: 20 Sec  Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 3 2 ...

  4. 洛谷P1027 Car的旅行路线

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

  5. 洛谷 P1027 Car的旅行路线

    P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速铁路 ...

  6. AC日记——Car的旅行路线 洛谷 P1027

    Car的旅行路线 思路: 这题不难,就是有点恶心: 而且,请认真读题目(就是题目卡死劳资): 来,上代码: #include <cmath> #include <cstdio> ...

  7. P1027 car的旅行路线

    car的旅行路线 洛谷链接 这个题关键就是 如何把每个点表示出来,其实求出四个点的坐标后,只需要把这些点连接起来,用一遍folyed求出最短路径就好了. 代码: #include<cmath&g ...

  8. 洛谷 P1027 Car的旅行路线 最短路+Dijkstra算法

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P1027 Car的旅行路线 题目描述 又到暑假了,住在 ...

  9. Car的旅行路线 luogu P1027 (Floyd玄学Bug有点毒瘤)

    luogu题目传送门! Car的旅行路线  问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一 ...

随机推荐

  1. NodeJS+ExpressJS+SocketIO+MongoDB应用模板

    OS:Win8.1 with update 关键字:NodeJS,ExpressJS,SocketIO,MongoDB. 1.源代码下载:https://github.com/ldlchina/ESM ...

  2. vs2013 上传碰到的问题:“输入的不是有效的 Base-64 字符串 ”

    action 代码: [HttpPost] [ValidateAntiForgeryToken] public ActionResult Create( ImageStoreModels images ...

  3. ios音频视频资料--备用

    视频播放 MediaPlayer.framework MPMoviePlayerViewController VS MPMoviePlayerController MPMoviePlayerViewC ...

  4. poj 1631 Bridging signals (二分||DP||最长递增子序列)

    Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9234   Accepted: 5037 ...

  5. python eval函数

    eval()函数十分强大,官方demo解释为:将字符串str当成有效的表达式来求值并返回计算结果. 可以把字符串转为list.tuple .dict  等数据类型 1.把字符串转为字典 ####### ...

  6. Spring 数据源配置一:单一数据源

    最近遇到一个项目,需要访问都多个数据源,并且数据库是不同厂商(mysql,  sqlserver). 所以对此做了一些研究,这里咱们采用渐进的方式来展开,先谈谈单一数据源配置.(稍后有时间会陆续补充其 ...

  7. Winform datagridview相关操作

    datagridview显示行号的2种方法: 方法一: 网上最常见的做法是用DataGridView的RowPostPaint事件在RowHeaderCell中绘制行号: privatevoiddat ...

  8. [转载]C#中获取时间戳(UnixTime)的方法

    .Net中没有封装获取时间戳(UnixTime,相对于1970年1月1日凌晨的毫秒数)的方法.因此本人写了如下方法实现. 提醒在摸索中的朋友,注意方法中的四舍五入.关于讨论四舍五入的方法,可以在这里找 ...

  9. PHP之序列化与反序列化讲解

    serialize() 把变量和它们的值编码成文本形式 unserialize() 恢复原先变量 eg: $stooges = array('Moe','Larry','Curly');$new = ...

  10. 字符串相似度算法(编辑距离算法 Levenshtein Distance)

    在搞验证码识别的时候需要比较字符代码的相似度用到“编辑距离算法”,关于原理和C#实现做个记录.据百度百科介绍:编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串 ...