題目鏈接
題意
給n個石頭的座標,要求從一個石頭到另一個石頭路徑上石頭之間的長度的最小最大距離。
思路
最短路的變形,dijkstra算法是有一個核心條件,d[v] > d[u] + cost[u][v]則替換,因爲到v的距離有更小的,這裏可以用d[v] > max(d[u], cost[u][v]),表示的意思是到v節點如果存在到u節點路徑中的最長距離小於到v節點路徑中的最長距離,就替換掉,至於加一個max是因爲(u,v)這條邊也在到v的這條路徑上,所以要取最大值。
#include <iostream>
#include <cstdio>
#include <queue>
#include <string.h>
#include <algorithm>
#include <cmath>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
#define pr pair<double, int>
const int MAXN = 300;
double d[MAXN];
bool final[MAXN];
int t, s, e, n;
double cost[MAXN][MAXN];
double dijkstra()
{
memset(final, 0, sizeof(final));
for (int i = 1; i <= n; i++) d[i] = INF;
priority_queue<pr, vector<pr>, greater<pr> > q;
q.push(make_pair(0, s));//first是length,second是頂點
d[s] = 0;
while (!q.empty())
{
int u = q.top().second;
q.pop();
final[u] = true;
for (int v = 1; v <= n; v++)
{
if(!final[v] && d[v] > max(d[u], cost[u][v]))
{
d[v] = max(d[u], cost[u][v]);
q.push(make_pair(d[v], v));
}
}
}
return d[e];
}
struct node {
int x, y;
}p[MAXN];
int main()
{
int c = 0;
while (cin >> n, n) {
for (int i = 1; i <= n; i++) {
scanf("%d %d", &p[i].x, &p[i].y);
}
s = 1, e = 2;
memset(cost, INF, sizeof(cost));
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
if(i == j) continue;
cost[i][j] = cost[j][i] = sqrt((double)((p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y)));
}
}
double ans = dijkstra();
if(c) printf("\n");
printf("Scenario #%d\n", ++c);
printf("Frog Distance = %.3f\n", d[2]);
}
return 0;
}