最短路:POJ2253---Frogger(SPFA)

最短路:POJ2253—Frogger(SPFA)

题目来源:

https://vjudge.net/problem/POJ-2253

题意:

一个石头上的一只小青蛙Freddy 想要去见另一个小石头的小青蛙Fiona ,但是河水太脏,所以小青蛙需要通过跳石头去见心上人一面。
现在给你n个点,第一个点是Freddy的坐标,第二个点是Fiona的坐标,剩下n-2个点是其他石头。
问青蛙Freddy 找青蛙Fiona 的最小跳跃范围是多少

题解:

把距离存在邻接矩阵中,再用SPFA就好了。

AC代码:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
using namespace std;
#define ll long long
#define INF 0x3f3f3f3f
#define mem(a,b) memset(a,b,sizeof(a))
#define PI cos(-1)
const int maxn = 1010;
struct node
{
	int x,y;
}p[maxn];
double a[maxn][maxn],dis[maxn];
int vis[maxn];
void SPFA(int n)
{
	queue<int> q;
	for(int i=1;i<n;i++)
	{
		dis[i] = INF;
		vis[i] = 0;
	}
	dis[0] = 0;
	q.push(0);
	vis[0] = 1;
	while(!q.empty())
	{
		int tmp = q.front();
		q.pop();
		vis[tmp] = 0;
		for(int j=0;j<n;j++)
		{
			if(dis[j]>max(dis[tmp],a[tmp][j]))
			{
				dis[j] = max(dis[tmp],a[tmp][j]);
				if(!vis[j])
				{
					q.push(j);
					vis[j] = 1;
				}
			}
		}
	}
}
int main()
{
	int n,cas=1;
	while(~scanf("%d",&n))
	{
		if(n==0) break;
		for(int i=0; i<n; i++)
		{
			scanf("%d %d",&p[i].x,&p[i].y);
		}
		for(int j=0; j<n; j++)
		{
			for(int i=0; i<=j; i++)
			{
				a[j][i] = sqrt(1.0*(p[j].x-p[i].x)*(p[j].x-p[i].x)+1.0*(p[j].y-p[i].y)*(p[j].y-p[i].y));
				a[i][j] = sqrt(1.0*(p[j].x-p[i].x)*(p[j].x-p[i].x)+1.0*(p[j].y-p[i].y)*(p[j].y-p[i].y));
			}
		}
		SPFA(n);
		printf("Scenario #%d\nFrog Distance = %.3f\n\n",cas++,dis[1]);
	}
	return 0;
}
发布了51 篇原创文章 · 获赞 16 · 访问量 3365

猜你喜欢

转载自blog.csdn.net/weixin_43911945/article/details/102976242