Ruta más corta: POJ2253 — Frogger (SPFA)
Fuente del tema:
https://vjudge.net/problem/POJ-2253
Tema:
Una pequeña rana en una piedra Freddy quiere ver a otra pequeña rana de piedra, Fiona, pero el río está demasiado sucio, por lo que la pequeña rana necesita saltar sobre la piedra para encontrarse con el amor.
Ahora dale n puntos, el primer punto son las coordenadas de Freddy, el segundo punto son las coordenadas de Fiona y los puntos n-2 restantes son otras piedras.
Pregúntale a la rana Freddy cuál es el rango mínimo de salto para encontrar a la rana Fiona
Solución:
Simplemente almacene la distancia en la matriz de adyacencia y use SPFA.
Código 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;
}