首页 > 代码库 > poj 2627 Gopher and hawks 最短路

poj 2627 Gopher and hawks 最短路

题意:

给老鼠的速度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.");
	else
		printf("Yes, visiting %d other holes.",d[1]-1);	
	return 0;	
} 


poj 2627 Gopher and hawks 最短路