POJ3439 Server Relocation bfs

来源:互联网 发布:c语言判断是否为数字 编辑:程序博客网 时间:2024/06/06 08:34

BFS 很基础的一道bfs。

只要注意坐标用double即可。

用int会溢出wa。

#include<stdio.h>

#include<memory.h>
#include<math.h>
int n,start,end;
double len1,len2;
const int N=1005;
struct node
{
double x,y;
}outlet[N];
double mat[N][N];
bool visit[N];
int dis[N];
const int inf=99999999;
int que[999999];
void bfs()
{
int head=1,tail=1;
que[tail++]=start;
dis[start]=0;
visit[start]=true;
while(head<tail&&!visit[end])
{
int now=que[head++];
for(int i=1;i<=n;i++)
{

if(mat[now][i]<=len1+len2&&!visit[i])
{
dis[i]=dis[now]+1;
visit[i]=true;
que[tail++]=i;
}
}
}
if(!visit[end])
printf("Impossible\n");
else
printf("%d\n",dis[end]);
}
int main()
{
//freopen("C:\\Users\\wuyanyisb\\Desktop\\1.txt","r",stdin);
int cases;
scanf("%d",&cases);
while(cases--)
{
scanf("%d%d%d%lf%lf",&n,&start,&end,&len1,&len2);
memset(mat,0,sizeof(mat));
memset(visit,0,sizeof(visit));
memset(dis,0,sizeof(dis));
for(int i=1;i<=n;i++)
{
scanf("%lf%lf",&outlet[i].x,&outlet[i].y);
}
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
{
mat[i][j]=mat[j][i]=sqrt(double((outlet[i].x-outlet[j].x)*(outlet[i].x-outlet[j].x))+double((outlet[i].y-outlet[j].y)*(outlet[i].y-outlet[j].y)));
}
bfs();
}
return 0;
}
原创粉丝点击