码迷,mamicode.com
首页 > 其他好文 > 详细

POJ 2253. Frogger

时间:2020-07-27 09:48:03      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:href   更新   c++   space   print   最短路变形   vector   scan   distance   

题目链接:

http://poj.org/problem?id=2253

题意:

找从起点到终点所有可能的路径中的最大边权的最小值

思路:

最短路变形

将松弛操作判断条件 dist[v]>dist[u]+w[u][v] 改为 dist[v]>max(dist[u],w[u][v])

更新操作 dist[v]=dist[u]+w[u][v] 改为 dist[v]=max(dist[u],w[u][v])

代码:

#include<cstdio>
#include<cmath>
#include<vector>
#include<queue>
using namespace std;
const int N=205;
int n;
bool st[N];
double dist[N];
vector<pair<int,double> > G[N];
pair<double,double> a[N];
double dijkstra() {
	priority_queue<pair<double,int>,vector<pair<double,int> >,greater<pair<double,int > > > q;
	for(int i=1;i<=n;i++) dist[i]=2e9,st[i]=false;
	q.push(make_pair(0,1));
	dist[1]=0;
	while(!q.empty()) {
		int u=q.top().second;
		q.pop();
		if(u==2) break;
		if(st[u]) continue;
		st[u]=true;
		for(int i=0;i<G[u].size();i++) {
			int v=G[u][i].first;
			double w=G[u][i].second;
			if(st[v]) continue;
			if(dist[v]>max(dist[u],w)) {
				dist[v]=max(dist[u],w);
				q.push(make_pair(dist[v],v));
			}
		}
	}
	return dist[2];
}
int main() {
    for(int k=1;;k++) {
    	scanf("%d",&n);
    	if(!n) return 0;
    	for(int i=1;i<=n;i++) G[i].clear();
    	for(int i=1;i<=n;i++) {
    		scanf("%lf%lf",&a[i].first,&a[i].second);
    		for(int j=1;j<i;j++) {
    			double w=sqrt((a[i].first-a[j].first)*(a[i].first-a[j].first)+(a[i].second-a[j].second)*(a[i].second-a[j].second));
    			G[i].push_back(make_pair(j,w));
    			G[j].push_back(make_pair(i,w));
    		}
    	}
    	printf("Scenario #%d\n",k);
    	printf("Frog Distance = %.3f\n\n",dijkstra());
    }
    return 0;
}

POJ 2253. Frogger

标签:href   更新   c++   space   print   最短路变形   vector   scan   distance   

原文地址:https://www.cnblogs.com/c4Lnn/p/13382891.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!