2018.07.06 POJ1556 The Doors(最短路)
The Doors
Time Limit: 1000MS Memory Limit: 10000K
Description
You are to find the length of the shortest path through a chamber containing obstructing walls. The chamber will always have sides at x = 0, x = 10, y = 0, and y = 10. The initial and final points of the path are always (0, 5) and (10, 5). There will also be from 0 to 18 vertical walls inside the chamber, each with two doorways. The figure below illustrates such a chamber and also shows the path of minimal length.
Input
The input data for the illustrated chamber would appear as follows.
2
4 2 7 8 9
7 3 4.5 6 7
The first line contains the number of interior walls. Then there is a line for each such wall, containing five real numbers. The first number is the x coordinate of the wall (0 < x < 10), and the remaining four are the y coordinates of the ends of the doorways in that wall. The x coordinates of the walls are in increasing order, and within each line the y coordinates are in increasing order. The input file will contain at least one such set of data. The end of the data comes when the number of walls is -1.
Output
The output should contain one line of output for each chamber. The line should contain the minimal path length rounded to two decimal places past the decimal point, and always showing the two decimal places past the decimal point. The line should contain no blanks.
Sample Input
1
5 4 6 7 8
2
4 2 7 8 9
7 3 4.5 6 7
-1
Sample Output
10.00
10.06
Source
Mid-Central USA 1996
一道相对来说偏综合的简单题,我们将墙拆成两个点,然后这道题的样例图示给了我们很好的思路:样例图示中整张图被巧妙地搞成了一张类分层图,而题目又让我们求从s" role="presentation" style="position: relative;">ss到t" role="presentation" style="position: relative;">tt的最短路径,题目中还巧妙地回避了有负边权的情况。既然这样,我们怎么可能不用dijstra" role="presentation" style="position: relative;">dijstradijstra来跑最短路呢?然后就是建图的问题了,最开始我想到的是相邻两层之间建边,但仔细一想这样会gg" role="presentation" style="position: relative;">gggg,于是改进一下建边的方法,对于每一个点,我们将它跟在它后面出现的点连边,边权的处理也很简单。如果两点之间可以直接抵达没有墙的间隔,那么直接将边权赋值为两点间的距离即可,如果有墙的间隔,我们不建边或者将边权赋成极大值,建完图之后跑最短路计算就行了。
然后还有一个坑点就是POJ" role="presentation" style="position: relative;">POJPOJ上用g++" role="presentation" style="position: relative;">g++g++的话double" role="presentation" style="position: relative;">doubledouble的输出只能用" role="presentation" style="position: relative;">(本蒟蒻因为这一点挂了10+" role="presentation" style="position: relative;">10+10+次)
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<cmath>
#define N 100005
#define eps 1e-15
using namespace std;
struct pot{double x,y;}p[N];
struct edge{int v,next;double w;}e[N];
struct line{pot a,b;}l[N];
struct heap{int u;double w;};
inline bool operator<(heap a,heap b){return a.w>b.w;}
int n,first[N],cnt=0,s,t,tot=0,totx=0;
double d[N];
bool vis[N];
inline void add(int u,int v,double w){
e[++cnt].v=v;
e[cnt].next=first[u];
e[cnt].w=w;
first[u]=cnt;
}
inline double dijsktra(){
priority_queue<heap>q;
for(int i=0;i<=tot;++i)d[i]=10000000000.0,vis[i]=false;
d[s]=0.0;
q.push((heap){s,d[s]});
while(!q.empty()){
heap x=q.top();
q.pop();
if(vis[x.u])continue;
vis[x.u]=true;
for(int i=first[x.u];i!=-1;i=e[i].next){
int v=e[i].v;
if(d[v]>d[x.u]+e[i].w){
d[v]=d[x.u]+e[i].w;
q.push((heap){v,d[v]});
}
}
}
return d[t];
}
inline double dis(pot a,pot b){return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
inline pot operator-(pot a,pot b){return (pot){a.x-b.x,a.y-b.y};}
inline double cross(pot a,pot b){return a.x*b.y-a.y*b.x;}
inline int sign(double x){return (x>eps)-(x<-eps);}
inline bool pd(pot a,pot b,pot c,pot d){return sign(cross(a-c,b-c))*sign(cross(a-d,b-d))<0;}
inline bool check(int a,int b){
for(int i=1;i<=totx;++i)if(pd(p[a],p[b],l[i].a,l[i].b)&&pd(l[i].a,l[i].b,p[a],p[b]))return false;
return true;
}
int main(){
p[s=0].x=0.0,p[s].y=5.0;
while(scanf("%d",&n)&&n!=-1){
memset(first,-1,sizeof(first));
cnt=0,tot=0,totx=0;
for(int i=1;i<=n;++i){
double x0,y1,y2,y3,y4;
scanf("%lf%lf%lf%lf%lf",&x0,&y1,&y2,&y3,&y4);
p[++tot].x=x0,p[tot].y=0.0;
p[++tot].x=x0,p[tot].y=y1;
p[++tot].x=x0,p[tot].y=y2;
p[++tot].x=x0,p[tot].y=y3;
p[++tot].x=x0,p[tot].y=y4;
p[++tot].x=x0,p[tot].y=10.0;
l[++totx].a=(pot){x0,0.0},l[totx].b=(pot){x0,y1};
l[++totx].a=(pot){x0,y2},l[totx].b=(pot){x0,y3};
l[++totx].a=(pot){x0,y4},l[totx].b=(pot){x0,10.0};
}
p[t=++tot].x=10.0,p[t].y=5.0;
for(int i=s;i<=t;++i)
for(int j=i+1;j<=t;++j)
if(check(i,j))add(i,j,dis(p[i],p[j]));
else add(i,j,10000000000.0);
printf("%.2lf\n",dijsktra());
}
return 0;
}
2018.07.06 POJ1556 The Doors(最短路)的更多相关文章
- 2018.07.06 POJ1698 Alice's Chance(最大流)
Alice's Chance Time Limit: 1000MS Memory Limit: 10000K Description Alice, a charming girl, have been ...
- EZ 2018 07 06 NOIP模拟赛
又是慈溪那边给的题目,这次终于没有像上次那样尴尬了, T1拿到了较高的暴力分,T2没写炸,然后T3写了一个优雅的暴力就203pts,Rank3了. 听说其它学校的分数普遍100+,那我们学校还不是强到 ...
- 2018.07.06 BZOJ 1588: HNOI2002营业额统计(非旋treap)
1588: [HNOI2002]营业额统计 Time Limit: 5 Sec Memory Limit: 162 MB Description 营业额统计 Tiger最近被公司升任为营业部经理,他上 ...
- 2018.07.06 BZOJ1208: HNOI2004宠物收养所(非旋treap)
1208: [HNOI2004]宠物收养所 Time Limit: 10 Sec Memory Limit: 162 MB Description 最近,阿Q开了一间宠物收养所.收养所提供两种服务:收 ...
- 2018.07.06 洛谷P2936 [USACO09JAN]全流Total Flow(最大流)
P2936 [USACO09JAN]全流Total Flow 题目描述 Farmer John always wants his cows to have enough water and thus ...
- 2018.07.06 POJ 1459 Power Network(多源多汇最大流)
Power Network Time Limit: 2000MS Memory Limit: 32768K Description A power network consists of nodes ...
- 2018.07.06 POJ2536 Gopher II(二分图匹配)
Gopher II Time Limit: 2000MS Memory Limit: 65536K Description The gopher family, having averted the ...
- 2018.07.06 POJ1273 Drainage Ditches(最大流)
Drainage Ditches Time Limit: 1000MS Memory Limit: 10000K Description Every time it rains on Farmer J ...
- 新手C#构造函数、继承、组合的学习2018.08.06/07
构造函数,是一种特殊的方法.主要用来在创建对象时初始化对象,即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中.特别的一个类可以有多个构造函数,可根据其参数个数的不同或参数类型的不同 ...
随机推荐
- 一本很好的书LearnOpenGL
这本书好像不怎么出名,但读起来非常易懂,知识全面 https://learnopengl.com/Advanced-Lighting/Normal-Mapping 基于物理的渲染 – 理论篇 < ...
- Haskell语言学习笔记(30)MonadCont, Cont, ContT
MonadCont 类型类 class Monad m => MonadCont m where callCC :: ((a -> m b) -> m a) -> m a in ...
- java包 命名规范 [转]
Java的包名都有小写单词组成,类名首字母大写:包的路径符合所开发的 系统模块的 定义,比如生产对生产,物资对物资,基础类对基础类.以便看了包名就明白是哪个模块,从而直接到对应包里找相应的实现. 由于 ...
- STC-51开发板-单片机控制数码管&按键&点阵综合操作
操作: 实现按下一个按键,对应的数码管和点阵显示相应的数字 代码: /* *******************数码管按键综合项目********************* */ #include ...
- js indexOf within Switch
https://stackoverflow.com/questions/22277447/indexof-within-switch switch (true) { case (msgRes.inde ...
- LINUX 修复relocation error: /lib/tls/libc.so.6
错误信息: relocation error: /lib/tls/libc.so.6: symbol _dl_tls_get_addr_soft, version GLIBC_PRIVATE not ...
- Java GC的原理
Java GC(garbage collec,垃圾收集,回收) GC是对JVM中的内存进行标记和回收,Sun公司的JDK用的虚拟机都是HotSpot 对象化的实例是放在heap堆内存中的,这里讲的分代 ...
- Loadrunner进行参数化
Loadrunner进行参数化 Loadrunner中进行参数化,这里有三种方法. 对需要多次使用的变量进行参数化,比如登录信息的用户名和密码,首先需要选中需要参数化的值,然后右键选择Replace ...
- gorm中数据库datetime类型的映射和time.Time的格式化
如果在结构体中设置time变量的类型是time.Time,那么gorm取出来的时间格式将会是”2006-01-02 15:04:05.999999999 -0700 MST“东八区时间,在time.T ...
- OpenCL、OpenGL、OpenAL
一:OpenCL (全称Open Computing Language,开放运算语言)是第一个面向异构系统通用目的并行编程的开放式.免费标准,也是一个统一的编程环境,便于软件开发人员为高性能计算服务器 ...