题目描述 Description

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

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

输入描述 Input Description

第一行为一个正整数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个城市高速铁路单位里程的价格。

输出描述 Output Description

共有n行,每行一个数据对应测试数据。

样例输入 Sample Input

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

样例输出 Sample Output

47.5

数据范围及提示 Data Size & Hint

如描述

思路分析:求出第四个点,一开始感觉什么高大上呢,其实就是勾股定理,三种情况,稍微注意下存边,再加上最短路就好,做了半天,当在同一城市时火车的价钱打成了机场的,卡了好久MD,加强静态查错能力。。

PS:基本上是看了(http://wenku.baidu.com/link?url=n3hmdiEGTq9j-cBOP7ZUC7t6Ea8FwG6vbrFDTeKhe5hi_x3flKpzelERXByhlQ2gbj7kzJXyZBwSkgAPIxISrkDzIp5bEl0oI9aP5tWbc-a),讲得很好。

Source:

 #include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
int n,vf,start,end,s;
int map[][],vn[];
bool used[];
double ans[];
double dist(int x1,int y1,int x2,int y2)
{
return (sqrt(pow((x1-x2),)+pow((y1-y2),)));
}
void dijistra()//dijistra求最短路 。
{
int i,j,now,apt;
double minn,u;
memset(used,,sizeof(used));
memset(ans,,sizeof(ans));
minn=;
used[start*]=true;
used[start*-]=true;
used[start*-]=true;
used[start*-]=true;
while (==)
{
minn=;
for (i=;i<=*n;i++)//枚举被经过的机场,对其余未被经过的机场进行dijstra。
{
if (used[i])
{
now=(i-)/+;
for (j=;j<=*now-;j++)// 若未被经过的机场dis值最小的在当前最短路的机场所在城市"前面",枚举所在城市的前面的机场。
{
if (!used[j])
{
u=ans[i]+dist(map[i][],map[i][],map[j][],map[j][])*vf;
if (u<minn)
{
minn=u;
apt=j;//记录机场位置
}
}
} for (j=*now-;j<=*now;j++)//若未被经过的机场dis值最小的和当前最短路的机场处于同一个城市,换交通方式。
{
if (!used[j])
{
u=ans[i]+dist(map[i][],map[i][],map[j][],map[j][])*vn[now];
if (u<minn)
{
minn=u;
apt=j;
}
}
}
for (j=*now+;j<=*n;j++)//同第一种情况。
{
if (!used[j])
{
u=ans[i]+dist(map[i][],map[i][],map[j][],map[j][])*vf;
if (u<minn)
{
minn=u;
apt=j;
}
}
} }
}
if ((apt==*end-) || (apt==*end-) || (apt==*end-) || (apt==*end))
{
printf("%.1lf\n",minn);
return;
}
else
{
used[apt]=true; ans[apt]=minn;
}
// }
}
}
void rf()//读入+根据平面内三点,求出第四个点的坐标。
{
int i;
int x,x1,x2,x3,y1,y2,y3,y;
scanf("%d%d%d%d",&n,&vf,&start,&end);
if (start==end)
{
printf("%.1lf",0.0);
return;
}
else
for (i=;i<=n;i++)
{
scanf("%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&x3,&y3,&vn[i]);
x=x1+x2-x3; y=y1+y2-y3;
if (dist(x1,y1,x2,y2)!=dist(x3,y3,x,y))
{
x=x1+x3-x2;
y=y1+y3-y2;
if (dist(x1,y1,x3,y3)!=dist(x2,y2,x,y))
{
x=x2+x3-x1;
y=y2+y3-y1;
}
}
map[i*-][]=x1; map[i*-][]=y1;
map[i*-][]=x2; map[i*-][]=y2;
map[i*-][]=x3; map[i*-][]=y3;
map[i*][]=x; map[i*][]=y;
}
dijistra();
} int main()
{
int i;
scanf("%d",&s);
for (i=;i<=s;i++)
{
memset(map,,sizeof(map));
//memset(ans,0,sizeof(ans));
rf();
}
return ;
}

【CodeVS】P1041 car的旅行路线的更多相关文章

  1. NOIP2001 Car的旅行路线

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

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

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

  3. GDOI2015小Z的旅行路线

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

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

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

  5. 洛谷P1027 Car的旅行路线

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

  6. 洛谷 P1027 Car的旅行路线

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

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

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

  8. codevs 1450 xth 的旅行

     时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 毕业了,Xth很高兴,因为他要和他的 ra ...

  9. P1027 car的旅行路线

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

随机推荐

  1. Delphi中record和packed record的区别

    转载:http://blog.csdn.net/rznice/article/details/6566978 第一种不带packed关键字的结构体表明编译器编译时要求进行字对齐. 而第二种带packe ...

  2. 关于strcpy_s

    #include"stdafx.h" #include<iostream> #include<cstring> int main() { using nam ...

  3. hibernate查询语句实例代码

    一.聚集函数的使用: avg(...), sum(...), min(...), max(...) count(*) count(...), count(distinct ...), count(al ...

  4. 解决css样式被内置样式覆盖的问题

    .preImg { height:400px !important } <img id="preImg" class="preImg" style=&qu ...

  5. linux环境下libevent的使用

    step1:安装libevent yum install libevent step2: 代码入下: #include <sys/socket.h> #include <sys/ty ...

  6. 使用PHP获取时间今天 明天 昨天 时间戳的详解

    使用php获取时间今天明天昨天时间戳 2013-06-20 11:12 <?php echo "今天:".date("Y-m-d")."< ...

  7. orientation和gravity的区别

    orientation:决定UI组件是按行还是列显示 gravity:指定文字对齐方式.

  8. LeetCode——Reverse Integer(逆置一个整数)

    问题: Reverse digits of an integer. Example1: x = 123, return 321 Example2: x = -123, return –321   Ha ...

  9. 汇编学习(六)——代码转换程序

    (一)逻辑运算指令 一.双操作数逻辑运算指令 1.指令格式: AND dst,src ; "与"运算, OR dst,src ; "或"运算 XOR dst,s ...

  10. 软考之PV操作(同步)

    这几天,陆续有那么三两个同学跟我讨论了一下关于软考上的PV操作的题,吾虽不才,但还是把同学们讲通了,在此,特分享一下自己的思路和想法,愿对大家有点帮助! 下面,我们就通过自己做过的试卷上两道题来分析: ...