//G++
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <set>
#include <queue>
#include <utility>
#include <algorithm>
using namespace std;
/*************************************************************************************************************/
struct node {
int x,y;
int id;
bool home,school;
int step;
node (int a,int b):x(a),y(b){}
node (){}
}p[1005];
int N,L;
bool way[1005][1005];
double D(int x1,int y1,int x2,int y2) {return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));}
int bfs() {
int i;
bool vis[1005]={0};
queue <node> q;
for(i=0;i<N+2;++i) {
if(p[i].school) {
vis[i]=1;
p[i].step=0;
q.push(p[i]);
break;
}
}
while(!q.empty()) {
node t=q.front();
q.pop();
for(i=0;i<N+2;++i) {
if(way[t.id][i]==1&&vis[p[i].id]==0) {
if(p[i].home) return t.step;
vis[p[i].id]=1;
p[i].step=t.step+1;
q.push(p[i]);
}
}
}
return -1;
}
bool cmp(node a,node b) {
if(a.x!=b.x)
return a.x<b.x;
return a.y<b.y;
}
int main() {
/*
容易忽略的一点是经过加油站时必须加油。即需考虑三点共线时的情况。
预处理,加边广搜即可
*/
int i,j,T,a,b;
scanf("%d",&T);
while(T--) {
scanf("%d%d",&N,&L);
memset(p,0,sizeof(p));
memset(way,0,sizeof(way));
for(i=0;i<N+2;++i) {
scanf("%d%d",&a,&b);
node tmp(a,b);
p[i]=tmp;
p[i].school=p[i].home=false;
if(i==0) p[i].school=true;
if(i==1) p[i].home=true;
}
sort(p,p+N+2,cmp);
for(i=0;i<N+2;++i) p[i].id=i;
//加边
for(i=0;i<N+2;++i) {
set < pair<int,int> > st;
for(j=i+1;j<N+2;++j) {
if(D(p[i].x,p[i].y,p[j].x,p[j].y)<=L) {
int x=p[j].x-p[i].x;
int y=p[j].y-p[i].y;
int d=__gcd(x,y);
if(st.find(make_pair(x/d,y/d))!=st.end()) continue;
st.insert(make_pair(x/d,y/d));
way[i][j]=way[j][i]=1;
}
}
}
int ans=bfs();
if(ans==-1) puts("impossible");
else printf("%d\n",ans);
}
return 0;
}
HDU 4885 TIANKENG’s travel
最新推荐文章于 2015-01-13 17:51:01 发布