【wikioi】1041 Car的旅行路线
算法:最短路(数据弱,Floyd也能过)
惨痛的教训:此题我至少提交了20次,原因在于= =太草率和粗心了,看到那个多少组数据以为是城市的数量,导致数组开得小小的= =。(对不起,wikioi的评测机= =)。一直报运行错误。。我居然一直没查到是越界= =TAT
记住:一定要看清数据范围啊啊啊啊啊!!!!!
此题最恶心的是处理第四个节点,刚开始我不知道怎么算第四个点(本人蒟蒻),以为单纯的x4=x1+x2-x3就可以过。。。可是不行。后面是看了题解的,应该是直角边终点x1,y1和x2,y2。所以要判断哪个是直角边。
对于线段L1、L2,如果 (x1-x2) * (x3-x2) + (y1-y2) * (y3-y2) = 0,那么L1 ⊥ L2。
上惨痛的代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#include <iomanip>
#include <cmath>
using namespace std;
const double oo = 10000000;
//城市的飞机场 (x-1)*4+1代表第x个城市开始的飞机场下标
#define CTOA(x) (((x-1)<<2)+1)
//距离
#define DISTANCE(x1,y1,x2,y2) ((double)sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)))
//此题我用FLOYD做的,因为数据太弱,过了
//每个飞机场为一个节点,答案就是A到B所有的路线最短路的最小值
struct city
{
int x[4], y[4];
}ct[105]; double node[4050][4050];
double T;
int s, t, A, B, N, i, j, k, l, temp, airport, tx[3], ty[3];
//至于计算第四个点,由数学知识我们可以知道,相互垂直的两条直线的斜率互为负倒数,所以我们只要每次计算AB、BC的斜率。
//如果不满足条件,那么将A、B、C的坐标分别赋值为B、C、A,这样不断迭代,直到AB、BC垂直,这样就能计算出第四个点的坐标。
//还要注意一个问题,如果AB或者BC与坐标轴垂直,需要单独讨论这种情况,因为被除数不能为零。
//(1) 首先判断直角的位置:
//因为从测试数据文件中读入的三个点的坐标是无序的,因此需判断直角的位置,然后在计算第四个点的坐标。
//对于线段L1、L2,如果(x1-x2)*(x3-x2)+(y1-y2)*(y3-y2)=0,那么L1 ⊥ L2。
//(2) 计算(x4,y4):
//由x4-x3=x1-x2得x4=x1-x2+x3,同样的y4=y1-y2+y3
void getfour(int c) //获取第四个城市
{
memcpy(tx, ct[c].x, sizeof(tx));
memcpy(ty, ct[c].y, sizeof(ty));
int tt;
while((tx[0]-tx[1])*(tx[2]-tx[1])+(ty[0]-ty[1])*(ty[2]-ty[1]))
{
tt = tx[0]; tx[0]=tx[1]; tx[1]=tx[2]; tx[2]=tt;
tt = ty[0]; ty[0]=ty[1]; ty[1]=ty[2]; ty[2]=tt;
}
ct[c].x[3] = tx[0]-tx[1]+tx[2];
ct[c].y[3] = ty[0]-ty[1]+ty[2];} int main()
{
cin >> N;
while(N--)
{
cin >> s >> t >> A >> B;
//注意A=B的情况,也就是出发的城市就是结束的城市,这是要直接输出‘0.0’;
if(A == B) {cout << "0.0\n";continue;}
//s<<2表示飞机场数量,即s*4
airport = s << 2;
for(i = 1; i <= airport; i++)
for(j = 1; j <= airport; j++)
node[i][j] = oo; //初始化 for(i = 1; i <= s; i++)
{
for(j = 0; j < 3; j++)
cin >> ct[i].x[j] >> ct[i].y[j];
cin >> T;
getfour(i);
//初始同一城市飞机场的花费
for(j = 0; j < 4; j++)
for(k = 0; k < 4; k++)
if(j != k)
node[CTOA(i)+j][CTOA(i)+k] = DISTANCE(ct[i].x[j], ct[i].y[j], ct[i].x[k], ct[i].y[k]) * T;
} //初始不同城市飞机场的花费
for(i = 1; i <= s; i++)
for(j = 1; j <= s; j++)
if(i != j)
for(k = 0; k < 4; k++)
for(l = 0; l < 4; l++)
node[CTOA(i)+k][CTOA(j)+l] = (DISTANCE(ct[i].x[k], ct[i].y[k], ct[j].x[l], ct[j].y[l]) * t); //Floyd
for(k = 1; k <= airport; k++)
for(i = 1; i <= airport; i++)
for(j = 1; j <= airport; j++)
node[i][j] = min(node[i][j], node[i][k]+node[k][j]); //A到B所有的路线最短路的最小值
double ans = oo;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
ans = min(ans, node[CTOA(A)+i][CTOA(B)+j]);
cout << setiosflags(ios::fixed) << setprecision(1) << ans << endl;
}
return 0;
}
【wikioi】1041 Car的旅行路线的更多相关文章
- [NOIP2001提高组]CODEVS1014 Car的旅行路线(最短路)
最短路,这个不难想,但是要为它加边就有点麻烦..还好写完就过了(虽然WA了一次,因为我调试用的输出没删了..),不然实在是觉得挺难调的.. ------------------------------ ...
- NOIP2001 Car的旅行路线
题四 Car的旅行路线(30分) 问题描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- 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的旅行路线 题目描述 又到暑假了,住在 ...
随机推荐
- Android android:gravity属性介绍及效果图
转自: http://blog.csdn.net/aminfo/article/details/7784229 Android:gravity的属性官方说明如下: public static fina ...
- Pyqt QDockWidget 停靠窗体
网上的一个关于QDockWidget 停靠窗体的教程 代码: # -*- coding: utf-8 -*- from PyQt4.QtGui import * from PyQt4.QtCore i ...
- Tiny Rss Reader - 迷你RSS阅读器
发布新软件 TinyRss: Windows平台上的一个小巧的Rss阅读器. 用户界面: 项目地址: https://github.com/movsb/tinyrss.git 测试下载: http:/ ...
- CXF学习 (1)
Axis(Apache) -> Axis2(Apache) XFire - > CXF (XFire+Celtrix) (Apache) CXF并不仅仅是Webservice框架,更号称是 ...
- APUE包含头文件"apue.h"问题
下载源码 从unix高级编程书籍官网下载书籍的上的所有源码. wget http://www.apuebook.com/src.tar.gz 解压这个文件 tar -zxvf src.tar.gz 解 ...
- 借助mosquitto“实时”远程监控服务器数据库运行状态
公司的项目还处于开发阶段,我把整个后台服务临时放在阿里云上供前端测试,用的阿里云的ECS云服务器,HTTP请求服务器和数据库服务都安装在一台机子上(穷啊,凑合用),做测试用,配置相当低:单核1Gb.其 ...
- PAT A 1014. Waiting in Line (30)【队列模拟】
题目:https://www.patest.cn/contests/pat-a-practise/1014 思路: 直接模拟类的题. 线内的各个窗口各为一个队,线外的为一个,按时间模拟出队.入队. 注 ...
- Java学习笔记(四)——流程控制语句
一.条件语句 1.if条件语句 (1)语法: if(条件) { 条件成立时的代码 } (2)执行过程 2.if else语句 if(条件) { 条件成立时的代码 } else { 不成立的代码 } 3 ...
- UML 之 四种关系
学习过UML的人都知道,UML之中有九种图和四种关系,今天,我们先来介绍一下这四种关系: 对于我们这些初学者来说,UML之中无非是 关联.依赖.泛化和实现,但是其中,关联和依赖又如何区分?泛化又如何 ...
- 移动端_line-height问题
如果把line-height加1px,iPhone文字就会下移,由于我们app的ios用户居多,并且android机型太多,不同机型也会显示不同,所以只能退而求其次了. line-height的兼容问 ...