【最短路】【Heap-dijkstra】Gym - 101147B - Street
按题意把图建出来跑最短路就行了。注意遮挡不会影响答案,所以不必考虑,因为走直线经过遮挡的时候,一定不会比答案更优。
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
using namespace std;
#define EPS 0.00000001
#define N 109
int T,n,H,X;
int hs[N],xs[N],ds[N];
bool is[N];
double sqr(int x)
{
return (double)x*(double)x;
}
int e,v[N*N*4],first[N],next[N*N*4];
double w[N*N*4];
void AddEdge(int U,int V,double W)
{
v[++e]=V;
w[e]=W;
next[e]=first[U];
first[U]=e;
}
double d[N];
bool vis[N];
struct Point{double d;int u;
Point(const double &X,const int &Y){d=X;u=Y;}
Point(){}};
bool operator < (Point a,Point b){return a.d>b.d;}
priority_queue<Point>q;
void dijkstra(int S)
{
for(int i=1;i<=n+2;++i) d[i]=1000000007.0;
d[S]=0; q.push(Point(0.0,S));
while(!q.empty())
{
Point x=q.top(); q.pop();
if(!vis[x.u])
{
vis[x.u]=1;
for(int i=first[x.u];i;i=next[i])
if(d[v[i]]-d[x.u]-w[i]>EPS)
{
d[v[i]]=d[x.u]+w[i];
q.push(Point(d[v[i]],v[i]));
}
}
}
}
int main()
{
freopen("street.in","r",stdin);
scanf("%d",&T);
for(;T;--T)
{
memset(v,0,sizeof(v));
memset(first,0,sizeof(first));
memset(w,0,sizeof(w));
memset(next,0,sizeof(next));
memset(vis,0,sizeof(vis));
e=0;
scanf("%d%d%d",&n,&H,&X);
for(int i=1;i<=n;++i)
scanf("%d%d%d%d",&hs[i],&xs[i],&ds[i],&is[i]);
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j)
if(is[i]==is[j] || (is[i]!=is[j] && xs[i]+xs[j]>X))
{
AddEdge(i,j,ds[j]-(ds[i]+hs[i])>=0 ? ds[j]-(ds[i]+hs[i]) : ds[i]-(ds[j]+hs[j]));
AddEdge(j,i,ds[j]-(ds[i]+hs[i])>=0 ? ds[j]-(ds[i]+hs[i]) : ds[i]-(ds[j]+hs[j]));
}
else if((ds[i]+hs[i]>=ds[j] && ds[i]<=ds[j]+hs[j]) ||
(ds[j]+hs[j]>=ds[i] && ds[j]<=ds[i]+hs[i]))
{
AddEdge(i,j,X-(xs[i]+xs[j]));
AddEdge(j,i,X-(xs[i]+xs[j]));
}
else if(ds[i]+hs[i]<ds[j])
{
AddEdge(i,j,sqrt(sqr(ds[j]-(ds[i]+hs[i]))+sqr(X-(xs[i]+xs[j]))));
AddEdge(j,i,sqrt(sqr(ds[j]-(ds[i]+hs[i]))+sqr(X-(xs[i]+xs[j]))));
}
else
{
AddEdge(i,j,sqrt(sqr(ds[i]-(ds[j]+hs[j]))+sqr(X-(xs[i]+xs[j]))));
AddEdge(j,i,sqrt(sqr(ds[i]-(ds[j]+hs[j]))+sqr(X-(xs[i]+xs[j]))));
}
for(int i=1;i<=n;++i)
{
AddEdge(n+1,i,ds[i]);
AddEdge(i,n+1,ds[i]);
AddEdge(i,n+2,H-(ds[i]+hs[i]));
AddEdge(n+2,i,H-(ds[i]+hs[i]));
}
dijkstra(n+1);
printf("%.6lf\n",d[n+2]);
}
return 0;
}
【最短路】【Heap-dijkstra】Gym - 101147B - Street的更多相关文章
- [POJ3463] Sightseeing(次短路 Heap + Dijkstra)
传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示 ...
- 最短路计数——Dijkstra
题目: 给出一个N个顶点M条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. ——传送门 受到题解的启发,用 Dijkstra A掉(手工代码) 思路: 1.无向无权图, ...
- BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]
3040: 最短路(road) Time Limit: 60 Sec Memory Limit: 200 MBSubmit: 2476 Solved: 814[Submit][Status][Di ...
- Radix Heap ---Dijkstra算法的优化 BY Gremount
Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC) -------C是最长的链路 Radi ...
- 10行实现最短路算法——Dijkstra
今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...
- UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)
题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...
- poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)
http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Subm ...
- hdoj 2544 最短路【dijkstra or spfa】
最短路 Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 最短路和次短路问题,dijkstra算法
/* *题目大意: *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和; * *算法思想: *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...
随机推荐
- EL遍历集合
jstl EL表达式遍历集合 博客分类: JSTL/EL JSTLEL遍历集合 在EL中,方括号运算符用来检索数组和集合的元素.对于实现 java.util.Map 接口的集合,方括号运算符使用关联 ...
- bzoj 2435 BFS
我们可以先将无根树变成有根树,随便选一个点当根就行了,我们选1,bfs求出来每个点 的size值,代表以它为根节点的子树中有多少个节点,(dfs可能会爆栈),然后再对于每一条 边算就好了 我tle了, ...
- hdu 2112 HDU Today (最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...
- Charles Android 抓包失败SSLHandshake: Received fatal alert: certificate_unknown
前提: Android使用Charles抓取Https请求的报文时,Android和Charles都正确安装了证书之后出现抓包失败,报错SSLHandshake: Received fatal ale ...
- python--requests_html
这个模块从名字上也能看出来,是专门用来解析html的,这个和requests的作者是同一人,非常牛逼的一位大佬. 大致读了一下源码,总共一个py文件(但是引用了其他的模块),加上注释总共才700多行, ...
- Linux下文件的三个时间意义及用法
Linux下文件的三个时间参数: (1)modification time(mtime):内容修改时间 这里的修改时间指的是文件的内容发生变化,而更新的时间. (2)change tim ...
- jQuery,月历,左右点击事件实现月份的改变
html页面: <div class="recordbriefing-title-top-body"> <span class="record-left ...
- 消除Git diff中^M的差异
消除Git diff中^M的差异 在Windows上把一个刚commit的文件夹上传到了Ubuntu.在Ubuntu上使用git status查看,发现很多文件都被红色标注,表示刚刚修改未add.在W ...
- mysql 使用set names 解决乱码问题
引子: 最近查询公司线上表数据,返现在Xshell控制台打印的数据都是乱码,记得之前瞄过同事都是执行set names UTF8 , 解决的,特记录如下.
- mysql的mysqladmin的用法
mysqladmin 适合于linux和windows系统 linux下:mysqladmin -u[username] -p[password] status windows下:先在安装目录找到my ...