spfa。
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int inf = 1e9;
int T = 1;
int n;
float x[205], y[205];
struct Edge
{
int v, next;
float t;
} e[39805];
int head[205], Count;
float d[205];
bool visited[205];
float dis(float x1, float y1, float x2, float y2)
{
return sqrt(pow(x1 - x2, 2) + pow(y1 - y2, 2));
}
void add(int u, int v, float t)
{
e[Count].v = v;
e[Count].t = t;
e[Count].next = head[u];
head[u] = Count ++;
}
void spfa()
{
queue<int> Q;
d[0] = 0;
Q.push(0);
visited[0] = true;
int p, q;
while(Q.size())
{
p = Q.front();
Q.pop();
visited[p] = false;
for(int i = head[p]; i != -1; i = e[i].next)
{
q = e[i].v;
if(d[q] > max(d[p], e[i].t))
{
d[q] = max(d[p], e[i].t);
if(!visited[q])
{
Q.push(q);
visited[q] = true;
}
}
}
}
}
int main()
{
while(cin >> n && n)
{
memset(head, -1, sizeof(head));
Count = 0;
for(int i = 0; i < n; i ++)
cin >> x[i] >> y[i];
for(int i = 0; i < n - 1; i ++)
for(int j = i + 1; j < n; j ++)
{
add(i, j, dis(x[i], y[i], x[j], y[j]));
add(j, i, dis(x[i], y[i], x[j], y[j]));
}
fill(d, d + n, inf);
memset(visited, false, sizeof(visited));
spfa();
printf("Scenario #%d\nFrog Distance = %.3f\n\n", T ++, d[1]);
}
// system("pause");
return 0;
}