题意:有两个青蛙和一堆石头,青蛙分别在石头1、2上,取青蛙路径为1到2的每条通路中最大边最小的权值,比如一条通路中最大边权值为2,另一条最大边权值为1.414,答案为1.414
思路:用dijkstra算法,最短路长度变为每条通路中最大边的最小权值,边的松弛根据每条通路最大边长度来操作
#include<cstdio>
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
const double inf = 999999;
int n, vis[205];
double g[205][205], d[205];
struct Node {
int x, y;
Node(int x = 0, int y = 0) : x(x), y(y) {}
}node[205];
int main()
{
int T = 0;
while (cin >> n && n) {
memset(vis, 0, sizeof(vis));
for (int i = 0; i < n; i++) {
cin >> node[i].x >> node[i].y;
d[i] = inf;
}
for (int i = 0; i < n; i++)
for (int j = 0; j < n; j++) {
g[i][j] = inf;
double x = node[i].x - node[j].x;
double y = node[i].y - node[j].y;
g[i][j] = min(g[i][j], sqrt(x*x + y*y));
g[j][i] = g[i][j];
}
d[0] = 0;
while (true) {
int k = -1;
for (int i = 0; i < n; i++)
if (!vis[i] && (k == -1 || d[i] < d[k]))
k = i;
if (k == -1)
break;
vis[k] = 1;
for (int i = 0; i < n; i++)
d[i] = min(d[i], max(d[k], g[i][k]));
}
printf("Scenario #%d\n", ++T);
printf("Frog Distance = %.3f\n\n", d[1]);
}
}