按题意把图建出来跑最短路就行了。注意遮挡不会影响答案,所以不必考虑,因为走直线经过遮挡的时候,一定不会比答案更优。

#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的更多相关文章

  1. [POJ3463] Sightseeing(次短路 Heap + Dijkstra)

    传送门 用dijkstra比较好,spfa可能有的重复 dis[x][2]:dis[x][0]表示起点到x的最短路.dis[x][1]表示起点到x的次短路: tot[x][2]:tot[x][0]表示 ...

  2. 最短路计数——Dijkstra

    题目: 给出一个N个顶点M条边的无向无权图,顶点编号为1−N.问从顶点1开始,到其他每个点的最短路有几条. ——传送门 受到题解的启发,用 Dijkstra A掉(手工代码) 思路: 1.无向无权图, ...

  3. BZOJ 3040: 最短路(road) [Dijkstra + pb_ds]

    3040: 最短路(road) Time Limit: 60 Sec  Memory Limit: 200 MBSubmit: 2476  Solved: 814[Submit][Status][Di ...

  4. Radix Heap ---Dijkstra算法的优化 BY Gremount

    Radix Heap 算法是在Dijkstra的Dial实现的基础上,通过减少对桶的使用,来优化算法的时间复杂度: Dial 时间复杂度是O(m+nC)     -------C是最长的链路 Radi ...

  5. 10行实现最短路算法——Dijkstra

    今天是算法数据结构专题的第34篇文章,我们来继续聊聊最短路算法. 在上一篇文章当中我们讲解了bellman-ford算法和spfa算法,其中spfa算法是我个人比较常用的算法,比赛当中几乎没有用过其他 ...

  6. UVA 11374 Airport Express 机场快线(单源最短路,dijkstra,变形)

    题意: 给一幅图,要从s点要到e点,图中有两种无向边分别在两个集合中,第一个集合是可以无限次使用的,第二个集合中的边只能挑1条.问如何使距离最短?输出路径,用了第二个集合中的哪条边,最短距离. 思路: ...

  7. poj 2449 Remmarguts' Date(第K短路问题 Dijkstra+A*)

    http://poj.org/problem?id=2449 Remmarguts' Date Time Limit: 4000MS   Memory Limit: 65536K Total Subm ...

  8. hdoj 2544 最短路【dijkstra or spfa】

    最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  9. 最短路和次短路问题,dijkstra算法

    /*  *题目大意:  *在一个有向图中,求从s到t两个点之间的最短路和比最短路长1的次短路的条数之和;  *  *算法思想:  *用A*求第K短路,目测会超时,直接在dijkstra算法上求次短路; ...

随机推荐

  1. EL遍历集合

    jstl EL表达式遍历集合 博客分类: JSTL/EL JSTLEL遍历集合  在EL中,方括号运算符用来检索数组和集合的元素.对于实现 java.util.Map 接口的集合,方括号运算符使用关联 ...

  2. bzoj 2435 BFS

    我们可以先将无根树变成有根树,随便选一个点当根就行了,我们选1,bfs求出来每个点 的size值,代表以它为根节点的子树中有多少个节点,(dfs可能会爆栈),然后再对于每一条 边算就好了 我tle了, ...

  3. hdu 2112 HDU Today (最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意:给出起点和终点,然后算出最短的路. 不过有好多细节要注意: (1)起始点和终止点相等的 ...

  4. Charles Android 抓包失败SSLHandshake: Received fatal alert: certificate_unknown

    前提: Android使用Charles抓取Https请求的报文时,Android和Charles都正确安装了证书之后出现抓包失败,报错SSLHandshake: Received fatal ale ...

  5. python--requests_html

    这个模块从名字上也能看出来,是专门用来解析html的,这个和requests的作者是同一人,非常牛逼的一位大佬. 大致读了一下源码,总共一个py文件(但是引用了其他的模块),加上注释总共才700多行, ...

  6. Linux下文件的三个时间意义及用法

    Linux下文件的三个时间参数: (1)modification time(mtime):内容修改时间        这里的修改时间指的是文件的内容发生变化,而更新的时间. (2)change tim ...

  7. jQuery,月历,左右点击事件实现月份的改变

    html页面: <div class="recordbriefing-title-top-body"> <span class="record-left ...

  8. 消除Git diff中^M的差异

    消除Git diff中^M的差异 在Windows上把一个刚commit的文件夹上传到了Ubuntu.在Ubuntu上使用git status查看,发现很多文件都被红色标注,表示刚刚修改未add.在W ...

  9. mysql 使用set names 解决乱码问题

    引子: 最近查询公司线上表数据,返现在Xshell控制台打印的数据都是乱码,记得之前瞄过同事都是执行set names UTF8 , 解决的,特记录如下.

  10. mysql的mysqladmin的用法

    mysqladmin 适合于linux和windows系统 linux下:mysqladmin -u[username] -p[password] status windows下:先在安装目录找到my ...