题意:服务器有两个插头,两个插线的长度给出。并给出n个插座的坐标,在服务器不会断电的基础上,通过俩个插头轮换插板。问从起点插座到终点插座要换几次。
解法:建图用最短路肯定可以。这里我用了广搜。复杂度应该都是n^2;
代码:
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
using namespace std;
int n,start,en;
double len1,len2;
struct point
{
double x,y;
int num;
} points[1010];
double getdis(int i,int j)
{
return sqrt((points[i].x-points[j].x)*(points[i].x-points[j].x)+
(points[i].y-points[j].y)*(points[i].y-points[j].y));
}
int que[10100];
bool rem[1010];
int main()
{
int t;
cin>>t;
while(t--)
{
memset(rem,0,sizeof rem);
scanf("%d%d%d%lf%lf",&n,&start,&en,&len1,&len2);start--,en--;
for(int i=0;i<n;i++)
scanf("%lf%lf",&points[i].x,&points[i].y),points[i].num=0;
que[0]=start;
rem[start]=1;
int left=0,right=1;
while(left<right)
{
int t=que[left];left++;
bool flag=true;
for(int i=0;i<n;i++)
{
if(!rem[i]&&getdis(i,t)<=len1+len2)
{
que[right++]=i,points[i].num=points[t].num+1;
if(i==en)
flag=false;
rem[i]=1;
}
}
if(!flag)
break;
}
if(left>=right)
cout<<"Impossible\n";
else
cout<<points[en].num<<endl;
}
return 0;
}
/*
2
4 1 4 2.000 1.000
0 0
0 4
4 0
4 4
9 1 4 2.000 300.000
0 7
-6 2
-3 3
6 2
-6 -3
3 -3
6 -3
-3 -7
0 -7
*/