链接: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. 深入理解跳表在Redis中的应用

    本文首发于:深入理解跳表在Redis中的应用微信公众号:后端技术指南针持续输出干货 欢迎关注 前面写了一篇关于跳表基本原理和特性的文章,本次继续介绍跳表的概率平衡和工程实现, 跳表在Redis.Lev ...

  2. 20191031-9 beta week 1/2 Scrum立会报告+燃尽图 07

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9917 一.小组情况 队名:扛把子 组长:孙晓宇 组员:宋晓丽 梁梦瑶 韩昊 ...

  3. Python 编程语言要掌握的技能之一:编写条件分支代码的技巧

    Python 里的分支代码 Python 支持最为常见的 if/else 条件分支语句,不过它缺少在其他编程语言中常见的 switch/case 语句. 除此之外,Python 还为 for/whil ...

  4. 2019-10-8:渗透测试,基础学习,php基础,会话,文件包含,笔记

    php面向对象基础->调用符号构造函数construct,主要用来创建对象时初始化对象,为成员变量赋初始值,总与new运算符一起使用在创建对象的语句中 析构函数destructor,与构造函数相 ...

  5. APACHE HADOOP安装

    0.安装前准备 0.1 关闭防火墙 service iptables status service iptables stop 0.2 关闭Selinux 很多稀奇古怪的问题都是SELINUX导致的. ...

  6. SpringCloud Alibaba微服务实战三 - 服务调用

    导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...

  7. Djangoday2第二个app加减法

    第二个app 计算新建一个app在view定义显示的内容修改urls指定连接对应的视图测试另一种通过路径传参的方式访问网址路径传参的urls定义方法网址路径传参测试urls的urlnamedjango ...

  8. (Nginx+PHP+MySQL)单机+Redis部署

    链接:Nginx+PHP+MySQL+Redis多机部署 1.lnmp+redis工作机制 2.lnmp+redis操作步骤(lnmp为单机部署) (1)lnmp+redis实战环境 lnmp服务器: ...

  9. win10 安装 MySQL-5.7.28 记录

    目录 一.安装前准备 二.安装步骤 三.安装时踩的坑 一.安装前准备 1.云盘下载安装包以及客户端工具 下载地址:MySQL-5.7.28 + SQLyog 2.官网下载安装包 下载地址:https: ...

  10. 接口访问报错:The valid characters are defined in RFC 7230 and RFC 3986

    写了个接口,在测试访问的时候,需要传json串,但是后台报错了 The valid characters are defined in RFC 7230 and RFC 3986 当前使用的tomca ...