链接:https://ac.nowcoder.com/acm/contest/201/L
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 1048576K,其他语言2097152K
Special Judge, 64bit IO Format: %lld

题目描

Eagle Jump公司正在开发一款新的游戏。Hifumi Takimoto作为其中的员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。
这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1:Ax+By+C1=0, L2:Ax+By+C2=0,还有 n 个圆 Ci:(x−xi)2+(y−yi)2=ri2Ci:(x−xi)2+(y−yi)2=ri2。角色在直线上、圆上、园内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。
Hifumi Takimoto想从 L1 出发,走到 L2 。请计算最少需要多少体力。

输入描述:

第一行五个正整数 n,A,B,C1,C2(1≤ n ≤ 1000, -10000 ≤ A,B,C1,C2≤ 10000),其中 A,B 不同时为 0。
接下来 n 行每行三个整数 x,y,r(-10000 ≤ x,y ≤ 10000, 1≤ r ≤ 10000) 表示一个圆心为 (x,y),半径为 r 的圆。

输出描述:

仅一行一个实数表示答案。与正确结果的绝对误差或者相对误差不超过 10-4
即算正确。
示例1

输入

2 0 1 0 -4
0 1 1
1 3 1

输出

0.236068

题目大意:

给你两条平行的直线,n个圆,在直线和圆上运动不需要能量(距离),问从一条直线到另一条直线最少需要多少距离。

从一条直线到另一条直线,一共可能经过三种路径。

直线到直线,直线到圆,圆到圆,都是无向边。

这三种分别有1,2n,n^2条边,注意链式前向星开空间需要乘2。

以后最好还是用dijkstra的堆优化版本吧,spfa被卡了。

总结一下各种最短路算法的适用条件(V为点数,E为边数):

Floyd:V^3

Spfa:平均kE(一般k为小常数2,表示每个点平均进队次数) 最差VE 可见稠密图卡爆,故若正权图就用dijkstra吧,只有负权图用spfa

Dijkstra:普通V^2 堆优化ElogV 可见稠密图上普通版,其他只要都上堆优化版,不过只适用于正权图的情况

还涉及到一点计算几何。要入门计算几何了嘛?233

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <set>
typedef long long ll;
const double eps=1e-;
const int mod=;
const double inf=;
const int maxn=;
const int maxm=; using namespace std; struct tcircle
{
double x,y,r;
};
tcircle cir[maxn+]; double dotdot(double x1,double y1,double x2,double y2)
{
return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
} double dotline(double x,double y,double a,double b,double c)
{
return fabs(a*x+b*y+c)/sqrt(a*a+b*b);
} double lineline(double a,double b,double c1,double c2)
{
return fabs(c1-c2)/sqrt(a*a+b*b);
} int to[(maxn+)*(maxn+)+];
double w[(maxn+)*(maxn+)+];
int nex[(maxn+)*(maxn+)+];
int head[maxn+],cnt=; void addedge(int u,int v,double wei)
{
to[cnt]=v;w[cnt]=wei;
nex[cnt]=head[u];head[u]=cnt++;
to[cnt]=u;w[cnt]=wei;
nex[cnt]=head[v];head[v]=cnt++;
} struct tnode
{
double d;
int u;
bool operator<(const tnode& rhs) const
{
return d>rhs.d;
}
};
double dis[maxn+];
int done[maxn+]; int main()
{
int n;
double a,b,c1,c2;
scanf("%d%lf%lf%lf%lf",&n,&a,&b,&c1,&c2);
for(int i=;i<=n;i++)
scanf("%lf%lf%lf",&cir[i].x,&cir[i].y,&cir[i].r); memset(head,-,sizeof(head));
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
double d=dotdot(cir[i].x,cir[i].y,cir[j].x,cir[j].y);
if(d>cir[i].r+cir[j].r)
addedge(i,j,d-cir[i].r-cir[j].r);
else
addedge(i,j,);
}
}
for(int i=;i<=n;i++)
{
double d;
d=dotline(cir[i].x,cir[i].y,a,b,c1);
if(d>cir[i].r)
addedge(i,n+,d-cir[i].r);
else
addedge(i,n+,);
d=dotline(cir[i].x,cir[i].y,a,b,c2);
if(d>cir[i].r)
addedge(i,n+,d-cir[i].r);
else
addedge(i,n+,);
}
addedge(n+,n+,lineline(a,b,c1,c2)); for(int i=;i<=n+;i++)
dis[i]=inf;
dis[n+]=;
memset(done,,sizeof(done));
priority_queue<tnode> q;
q.push((tnode){,n+});
while(!q.empty())
{
tnode x=q.top();q.pop();
int u=x.u;
if(done[u])
continue;
done[u]=;
for(int i=head[u];i!=-;i=nex[i])
{
int l=to[i];
if(dis[l]>dis[u]+w[i])
{
dis[l]=dis[u]+w[i];
q.push((tnode){dis[l],l});
}
}
} printf("%f\n",dis[n+]); return ;
}

牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)的更多相关文章

  1. 牛客国庆集训派对Day1 L-New Game!(最短路)

    链接:https://www.nowcoder.com/acm/contest/201/L 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...

  2. 2019牛客国庆集训派对day1(A, B E F K)

    链接:https://ac.nowcoder.com/acm/contest/1099#question A:可知符合条件的图中间肯定存在一个由1构成的矩形,找到由1构成矩形的边界,判断出现的1的数量 ...

  3. 牛客国庆集训派对Day1 Solution

    A    Tobaku Mokushiroku Kaiji 水. #include <bits/stdc++.h> using namespace std; ], b[]; void Ru ...

  4. 牛客国庆集训派对Day1:J:Princess Principal(栈模拟求括号匹配)

    题目描述 阿尔比恩王国(the Albion Kingdom)潜伏着一群代号“白鸽队(Team White Pigeon)”的间谍.在没有任务的时候,她们会进行各种各样的训练,比如快速判断一个文档有没 ...

  5. 2019牛客国庆集训派对day1 K题 双向链表练习题 splay区间翻转

    题目链接: 解法: 先建n颗平衡树,合并的时候将a中最右的结点翻转到根节点,b中最左的结点翻转到根节点,对合并后的根节点进行标记. #include <bits/stdc++.h> usi ...

  6. 牛客国庆集训派对Day1.B.Attack on Titan(思路 最短路Dijkstra)

    题目链接 \(Description\) 给定\(n,m,C\)及大小为\((n+1)(m+1)\)的矩阵\(c[i][j]\).平面上有\((n+1)(m+1)\)个点,从\((0,0)\)编号到\ ...

  7. 牛客国庆集训派对Day1 B. Attack on Titan

    B. Attack on Titan 链接 #include<cstdio> #include<algorithm> #include<cstring> #incl ...

  8. 2019牛客国庆集训派对day1

    C 存每个值存在的位置,枚举末尾的值,再枚举前面的值,哈希二分出最长相同的,即剩下的为不同的 D \(f_{i,j,k}\)为前i位,最后一个3因子在j,次因子在k G bitset处理有多少位置符合 ...

  9. 牛客国庆集训派对Day6 A Birthday 费用流

    牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...

随机推荐

  1. Java IO入门

    目录 一. 数据源(流) 二. 数据传输 三. 总结 我们从两个方面来理解Java IO,数据源(流).数据传输,即IO的核心就是对数据源产生的数据进行读写并高效传输的过程. 一. 数据源(流) 数据 ...

  2. 使用原生javaScript绘制带图片的二维码---js

    使用链接生成二维码主要是使用qr.js或者其他,把链接转化为二维码的形式,在使用canvas时需要设置画布的尺寸,生成的颜色. <div class="qr_code"> ...

  3. 初探three.js光源

    上一节我们简单的说了一下THREE中必要的元素.今天我们深入探讨一下各种THREE的光源. 一 基础光源 基础光源有4种1.THREE.AmbientLight(环境光源)2.THREE.PointL ...

  4. JavaScript笔记十

    1.正则表达式 - 语法: - 量词 {n} 正好n次 {m,n} m-n次 {m,} 至少m次 + 至少1次 {1,} ? 0次或1次 {0,1} * 0次或多次 {0,} - 转义字符 \ 在正则 ...

  5. applicationContext-dao.xml 配置错误

    https://www.captainbed.net/ 配置文件报错: 不允许有匹配 "[xX][mM][lL]" 的处理指令目标. 错误原因: 由于大部分都是搬砖,所以格式没注意 ...

  6. Altium Designer 20.0.9

    Altium Designer 20.0.9 Download: http://dl3.downloadly.ir/Files/Software/Altium_Designer_20.0.9_Buil ...

  7. Jenkins修改默认主目录及数据迁移

    前言 在使用Jenkins做持续集成的初期,未能预估项目量的大小.于是乎,配置都是使用的默认配置,而Jenkins的默认主目录放在了服务器的根目录下. 随着时间的推移,项目量的持续增加,在运维过程中就 ...

  8. centos7忘记root密码的重置方法-超简单

    忘记root密码,重置root密码8步. 1.在开机界面按e进入grub编辑模式 2.找到 ro修改为rw /sysroot/bin/sh 3.Ctrl + x 启动 4.chroot /sysroo ...

  9. git的用法 回到某个版本

    进入到项目文件夹 如果新建项目时没有勾选git 进入到项目中

  10. 大型情感剧集Selenium:9_selenium配合Pillow完成浏览器局部截图

    网页截图 上次提到了selenium的四种截图方法,最终截图了整张网页.但很多时候,我们仅仅需要截图部分的内容.比如截取某个关键信息,或者现在已经不常见的截图验证码(现在都是各种按规则点击-).那么我 ...