题意:车从起点出发,每次只能行驶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)判断三点共线建图)+最短路的更多相关文章

  1. hdu 4885 (n^2*log(n)推断三点共线建图)+最短路

    题意:车从起点出发,每次仅仅能行驶L长度,必需加油到满,每次仅仅能去加油站或目的地方向,路过加油站就必需进去加油,问最小要路过几次加油站. 開始时候直接建图,在范围内就有边1.跑最短了,再读题后发现, ...

  2. HDU - 4305 - Lightning 生成树计数 + 叉积判断三点共线

    HDU - 4305 题意: 比较裸的一道生成树计数问题,构造Krichhoof矩阵,求解行列式即可.但是这道题还有一个限制,就是给定的坐标中,两点连线中不能有其他的点,否则这两点就不能连接.枚举点, ...

  3. HDU 4185 ——Oil Skimming——————【最大匹配、方格的奇偶性建图】

    Oil Skimming Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit ...

  4. HDU 4725 The Shortest Path in Nya Graph( 建图 + 最短路 )

    主要是建图,建好图之后跑一边dijkstra即可. 一共3N个点,1~N是原图中的点1~N,然后把每层x拆成两个点(N+x)[用于连指向x层的边]和(N+N+x)[用于连从x层指出的边]. 相邻层节点 ...

  5. hdu 3572 仪器与任务 最大流 好题 体会建图思想

    Task Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  6. Friends and Berries URAL - 2067 (计算三点共线和计算的时候的注意点)

    题目链接:https://cn.vjudge.net/problem/URAL-2067 具体思路:判断三点共线就可以了,只有一对点能满足,如果一对就没有那就没有满足的. 在计算的时候,要注意,如果是 ...

  7. 删除指定路径下固定格式,以.log结尾、三天前的文件,或删除空的日志文件

    师出‘百测’besttest 删除指定路径下固定格式,以.log结尾.三天前的文件,或删除空的日志文件. 日志文件格式:XXXX_2019-01-01.log. import os,datetime ...

  8. hdu 4885 TIANKENG’s travel(bfs)

    题目链接:hdu 4885 TIANKENG's travel 题目大意:给定N,L,表示有N个加油站,每次加满油能够移动距离L,必须走直线,可是能够为斜线.然后给出sx,sy,ex,ey,以及N个加 ...

  9. HDU 4034 Graph(Floyd变形——逆向判断)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4034 Problem Description Everyone knows how to calcu ...

随机推荐

  1. postman使用--构建工作流和newman

    构建工作流 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个 ...

  2. [BZOJ4899]:记忆的轮廓(概率DP)

    题目传送门 题目描述: 通往贤者之塔的路上,有许多的危机. 我们可以把这个地形看做是一颗树,根节点编号为1,目标节点编号为n,其中1-n的简单路径上,编号依次递增, 在[1,n]中,一共有n个节点.我 ...

  3. js采用正则表达式获取地址栏参数

    getQueryString:function(name) { var reg = new RegExp("(^|&)"+ name +"=([^&]*) ...

  4. vue 封装组件上传img

    var _uploadTemplate = '<div>'+ '<input type="file" name="file" v-on:cha ...

  5. centOS下jenkins

    转:centos7搭建jenkins小记 转自:https://segmentfault.com/a/1190000007086764 安装java环境 1.查看服务器版本 centos7,继续. c ...

  6. 【Python学习之一】list与tuple

    list -> [] list是python内置的有序集合数据类型,可随时添加和删除元素.例如:创建一个动物的列表: animal = ['cat', 'dog', 'pig' len()函数可 ...

  7. Ubuntu 18.04修改默认源

    安装Ubuntu 18.04后,使用国外源太慢了,修改为国内源会快很多. 修改阿里源为Ubuntu 18.04默认的源 备份/etc/apt/sources.list #备份 cp /etc/apt/ ...

  8. python logging with yaml

    Recently, I was made a service which can provide a simple way to get best model. so, i spent lot of ...

  9. Python从文件中读取数据

    一.读取整个文件内容 在读取文件之前,我们先创建一个文本文件resource.txt作为源文件. resource.txt my name is joker, I am 18 years old, H ...

  10. Python语言程序设计之三--列表List常见操作和错误总结

    最近在学习列表,在这里卡住了很久,主要是课后习题太多,而且难度也不小.像我看的这本<Python语言程序设计>--梁勇著,列表和多维列表两章课后习题就有93道之多.我的天!但是题目出的非常 ...