hdu 4885 (n^2*log(n)推断三点共线建图)+最短路
题意:车从起点出发,每次仅仅能行驶L长度,必需加油到满,每次仅仅能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站。
開始时候直接建图,在范围内就有边1.跑最短了,再读题后发现,若几个点共线,且都在范围内,那么中间有点的俩头的点就不能有边,否则与条件相悖。关键是怎么用n^2*logn,的复杂度推断三点共线:点先按X排序,考察每一个点i时候,第二个点j,若直线ij斜率已经存在,则不能加入了,查找是否存在,用容器即可(map\set)都是logn的,所以满足要求。之后最短路即可。
#include<iostream>
#include<cstring>
#include<queue>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int inf=0x3f3f3f3f;
struct points
{
long long x,y;
};
long long inline getdis(points a,points b)
{
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
bool my(points a,points b)
{
if(a.x!=b.x)return a.x<b.x;
else return a.y<b.y;
}
int n;long long l;
points po[1005];
int dis[1005][1008];
int d[1005];int inq[1005];
int ans=0;points s,t;int nums,numt;
double inline getk(points a,points b) //获得斜率
{
if(b.x==a.x)return inf;
return (a.y-b.y)*1.0/(a.x-b.x);
}
void spfa()
{
for(int i=0;i<n+2;i++)
{
d[i]=inf;
inq[i]=0;
}
queue<int>q;
inq[nums]=1;
d[nums]=0;
q.push(nums);
while(!q.empty())
{
int cur=q.front();
q.pop();
inq[cur]=0;
for(int i=0;i<n+2;i++)
{
if(d[i]>dis[cur][i]+d[cur])
{
d[i]=dis[cur][i]+d[cur];
if(!inq[i])
{
q.push(i);
inq[i]=1;
}
}
}
}
return ;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&l);
scanf("%d%d",&po[0].x,&po[0].y);
scanf("%d%d",&po[n+1].x,&po[n+1].y);
s.x=po[0].x; s.y=po[0].y;
t.x=po[n+1].x; t.y=po[n+1].y;
for(int i=1;i<=n;i++)
scanf("%d%d",&po[i].x,&po[i].y);
sort(po,po+n+2,my);
for(int i=0;i<=n+1;i++) //起点,终点
{
if(po[i].x==s.x&&po[i].y==s.y)nums=i;
if(po[i].x==t.x&&po[i].y==t.y)numt=i;
}
for(int i=0;i<=n+1;i++)
{
map<double,int>ma;
for(int j=i+1;j<=n+1;j++)
{
if(getdis(po[i],po[j])<=l*l) //在距离范围内的再查找。
{
double tempk=getk(po[i],po[j]);
if(ma.find(tempk)!=ma.end())
{
dis[j][i]=dis[i][j]=inf;
}
else
{
dis[j][i]=dis[i][j]=1;
ma[tempk]=1;
}
}
else
dis[j][i]=dis[i][j]=inf;
}
}
spfa();
if(d[numt]==inf)
printf("impossible\n");
else
printf("%d\n",d[numt]-1);
}
return 0;
}
hdu 4885 (n^2*log(n)推断三点共线建图)+最短路的更多相关文章
- hdu 4885 (n^2*log(n)判断三点共线建图)+最短路
题意:车从起点出发,每次只能行驶L长度,必需加油到满,每次只能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 开始时候直接建图,在范围内就有边1.跑最短了,再读题后发现,若几 ...
- HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线
HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...
- HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】
Oil Skimming Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit ...
- HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )
主要是建图,建好图之后跑一边dijkstra即可. 一共3N个点,1~N是原图中的点1~N,然后把每层x拆成两个点(N+x)[用于连指向x层的边]和(N+N+x)[用于连从x层指出的边]. 相邻层节点 ...
- hdu 3572 仪器与任务 最大流 好题 体会建图思想
Task Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- hdu 4885 TIANKENG’s travel(bfs)
题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...
- 删除指定路径下固定格式,以.log结尾、三天前的文件,或删除空的日志文件
师出‘百测’besttest 删除指定路径下固定格式,以.log结尾.三天前的文件,或删除空的日志文件. 日志文件格式:XXXX_2019-01-01.log. import os,datetime ...
- Food HDU - 4292 网络流 拆点建图
http://acm.hdu.edu.cn/showproblem.php?pid=4292 给一些人想要的食物和饮料,和你拥有的数量,问最多多少人可以同时获得一份食物和一份饮料 写的时候一共用了2种 ...
- HDU 3820 Golden Eggs( 最小割 奇特建图)经典
Golden Eggs Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
随机推荐
- UVa 11233 - Deli Deli
题目:求所给单词的负数形式. 分析:模拟. 直接按章题意分情况求解就可以. 说明:按语法也能够(⊙_⊙). #include <iostream> #include <cstdlib ...
- VC调试篇
难怪很多前辈说调试是一个程序员最基本的技能,其重要性甚至超过学习一门语言.不会调试的程序员就意味着他即使会一门语言,却不能编制出任何好的软件. 我以前接触的程序大多是有比较成形的思路和方法,调试起来出 ...
- Extjs学习----------动态载入js文件(减轻浏览器的压力)
动态载入js文件能够减轻浏览器的压力,本例使用了Ext.window.Window组件,该组件的学习地址:http://blog.csdn.net/z1137730824/article/detail ...
- 基于三星I9250演示自己弄的Miracast功能-手机对手机
最终把Miracast功能測试通了,为了节省时间.我的Source端和Sink端都採用同一个机型.这样能够降低我为目标机编译4.4.2源码所耗费的时间.今天简单录制了一段视频.视频是用手机录制的,室内 ...
- java多线程12设计模式
1.Single Threaded Execution Pattern(单线程运行模式) 2.Immutable Pattern(一成不变的模式) 3.Guarded Suspension Patte ...
- 方案猿身高project联赛,艺术家,相反,养殖场!-------三笔
已经看到了程序猿在电影中都是非常厉害的人物,硬道理键盘噼里啪啦后,奇妙的事情会发生. 当我报了这个专业,開始认真的写程序,在这个领域学习的时候,却发现非常多干这一行 的都自称"码农" ...
- 在VM已安装Android4.4 连接小米手环 网络设置
1.打开一个终端 2.输入su,选择同意 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl5dW4xMjNneA==/font/5a6L5L2T/fon ...
- HDU2844_Coins【多重背包】【二进制优化】
Coins Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- hdu4223(dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4223 由于n范围较小,完全可暴力... #include <cstdio> #includ ...
- 在CodeBlocks 开发环境中配置使用OpenCV (ubuntu系统)
CodeBlocks是一个开放源代码的全功能的跨平台C/C++集成开发环境.CodeBlocks由纯粹的C++语言开发完毕,它使用了蓍名的图形界面库wxWidgets.对于追求完美的C++程序猿,再也 ...