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;
}

发布了26 篇原创文章 · 获赞 2 · 访问量 418

猜你喜欢

转载自blog.csdn.net/D_Bamboo_/article/details/103500404