/*8785404 MDK 3439 Accepted 9544K 4297MS G++ 2604B 2011-06-24 17:41:22 */ //博客园不给力啊,这么破的编辑器,就是花瓶,动一点就碎!我足足打了三遍注释!!!! /*题目大意就是求出计算机从开始到destination走的最少点数,化成最短路,我一开始用的邻接表,果断TLE了,因为1000个点边的个数m可能很大,所以用邻接阵存,4000MS,多余计算还是很多,用BFS应该2000MS左右就能过了*/ #define MAXN 1500 #define inf 1000000000 typedef int elem_t; int minl[MAXN];int mat[MAXN][MAXN]; void dijkstra(int n,int s){ int i,j,k; int v[MAXN]={0}; for(i=0;i<n;i++) minl[i]=inf; for(minl[s]=0,i=0;i<n;i++) { for(k=-1,j=0;j<n;j++) if(!v[j]&&((k==-1)||minl[j]<minl[k])) k=j; for(v[k]=1,j=0;j<n;j++) if(!v[j]&&mat[k][j]) minl[j]=min(minl[k]+1,minl[j]); } } typedef pair<double,double> pa; pa p[MAXN]; inline double dis(pa a,pa b) { return (a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second); } int main() { //freopen("d:\\2.txt","r",stdin); int N;SCF(N); while(N--) { SET(mat,0); int n,a,b,tm1,tm2;double s1,s2; scanf("%d %d %d %lf %lf",&n,&a,&b,&s1,&s2); double s=pow(s1+s2,2); F(i,n) { SCFD(tm1,tm2); p[i].first=tm1; p[i].second=tm2; } for(int i=0;i<n;i++) { for(int j=i;j<n;j++) { if(dis(p[i],p[j])<=s) { mat[i][j]=mat[j][i]=1; } } } dijkstra(n,a-1); int si=minl[b-1]; if(si<inf) PCFLN(si); else printf("Impossible\n"); } } //而且这里的距离函数可以小小的优化下。