标准的的求最短路问题:
bfs直接过
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
vector<int >v[1100];
int step[1100];
int vis[1100];
double dis[1100][1100];
double l,r;
int n,s,t;
bool flag;
int bfs(int x)
{
memset(vis,0,sizeof(vis));
vis[x]=1;
queue<int >q;
q.push(x);
while(!q.empty())
{
int p=q.front();
if(p==t)
{
return step[t];
}
q.pop();
for(int i=0;i<v[p].size();i++)
{
int tt=v[p][i];
// cout<<"tt:"<<tt<<endl;
if(vis[tt]==0)
{
//cout<<"tt:"<<tt<<endl;
step[tt]=step[p]+1;
vis[tt]=1;
q.push(tt);
}
}
}
return -1;
}
int main()
{
int T;
cin>>T;
while(T--)
{
for(int i=0;i<1100;i++)
v[i].clear();
flag=0;
memset(step,0,sizeof(step));
scanf("%d%d%d%lf%lf",&n,&s,&t,&l,&r);
double lr=l+r;
int a[1100],b[1100];
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i],&b[i]);
}
for(int i=1;i<=n;i++)
{
for(int j=i;j<=n;j++)
{
dis[i][j]=sqrt(1.0*(a[i]-a[j])*(a[i]-a[j])+1.0*(b[i]-b[j])*(b[i]-b[j]));
dis[j][i]=dis[i][j];
}
}
//cout<<"dis[4][6]:"<<dis[4][6]<<endl;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(i!=j&&dis[i][j]<=lr)
{
v[i].push_back(j);
}
}
}
/* for(int i=1;i<=n;i++)
{
cout<<i<<":";
for(int j=0;j<v[i].size();j++)
{
cout<<v[i][j];
}
cout<<endl;
}*/
int uu=bfs(s);
if(uu==-1)
cout<<"Impossible"<<endl;
else
cout<<uu<<endl;
}
return 0;
}
/*
2
4 1 4 2.000 1.000
0 0
0 4
4 0
4 4
9 1 4 2.000 3.000
0 7
-6 2
-3 3
6 2
-6 -3
3 -3
6 -3
-3 -7
0 -7
*/
spfa 做法下午补上