当前位置: 代码迷 >> 综合 >> poj 2627 Gopher and hawks 最短路
  详细解决方案

poj 2627 Gopher and hawks 最短路

热度:30   发布时间:2024-01-19 06:04:47.0

题意:

给老鼠的速度v和移动时老鼠在洞外的最长时间m、地面上n个点的坐标,问老鼠是否可以从洞1到洞2,可以的话求最少跳数。

分析:

裸的最短路,注意精度。

代码:

//poj 2627
//sep9
#include <iostream>
#include <queue>
using namespace std;
const int maxN=1024;
const int maxM=2000024;
int n,e,head[maxN];
int d[maxN];
int inq[maxN];
struct Point
{__int64 x,y;
}pnt[1024];
__int64 v,m;struct Edge
{int v,w,nxt;
}edge[maxM]; 
void addedge(int u,int v,int w)
{edge[e].v=v;edge[e].w=w;edge[e].nxt=head[u];head[u]=e++;edge[e].v=u;edge[e].w=w;edge[e].nxt=head[v];head[v]=e++;
}
queue<int> Q;
void spfa()
{for(int i=0;i<n;++i) d[i]=INT_MAX;memset(inq,0,sizeof(inq));d[0]=0;	Q.push(0);inq[0]=1;while(!Q.empty()){int u=Q.front();Q.pop();inq[u]=0;for(int i=head[u];i!=-1;i=edge[i].nxt){int v=edge[i].v,w=edge[i].w;if(d[u]+w<d[v]){d[v]=d[u]+w;if(!inq[v]){inq[v]=1;Q.push(v);}}}}
}int main()
{e=0;memset(head,-1,sizeof(head));	scanf("%I64d%I64d",&v,&m);m*=60;double x,y;n=0;while(scanf("%lf%lf",&x,&y)==2){pnt[n].x=(__int64)(x*1000.0+1e-6);pnt[n].y=(__int64)(y*1000.0+1e-6);	++n;}int i,j;for(i=0;i<n;++i)for(j=i+1;j<n;++j){__int64 dis=(pnt[i].x-pnt[j].x)*(pnt[i].x-pnt[j].x)+(pnt[i].y-pnt[j].y)*(pnt[i].y-pnt[j].y);if(dis<=v*m*v*m*1000000)addedge(i,j,1);			}		spfa();if(d[1]==INT_MAX)printf("No.");elseprintf("Yes, visiting %d other holes.",d[1]-1);	return 0;	
}