POJ2253---Frogger最小最大邊

題目鏈接
題意
給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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章