凡人修c传(十四)基本最短路 朴素Dijkstra算法

        [kuangbin带你飞]专题四 最短路练习 [Cloned] - Virtual Judge

湖中有n块石头,编号从1到n,有两只青蛙,Bob在1号石头上,Alice在2号石头上,Bob想去看望Alice,但由于水很脏,他想避免游泳,于是跳着去找她。但是Alice的石头超出了他的跳跃范围。因此,Bob使用其他石头作为中间站,通过一系列的小跳跃到达她。两块石头之间的青蛙距离被定义为两块石头之间所有可能路径上的最小必要跳跃距离,某条路径的必要跳跃距离即这条路径中单次跳跃的最远跳跃距离。你的工作是计算Alice和Bob石头之间的青蛙距离。

这题我用的是Dijkstra,这题算是一道最短路的变形题,加深了我对朴素Dijkstra算法的理解。不同点在何处?在于动态方程的转变,并非简单的去求路程和的最短,而是要求的是所能到达路径中最大路径的最小距离。

代码如下:

#include<stdio.h>
#include<iostream>
#include<map>
#include<math.h>
#include<string.h>
#include<algorithm>

#include<queue>
using namespace std;
typedef long long ll;
double mapp[505][505];
double dis[1005];
bool c[1005];
struct we{
	double x,y;
}hh[2005];
int main(){
	
	ll n;
	int an=0;
	while(~scanf("%lld",&n)){
		
		if(n==0)break;
		an++;
		printf("Scenario #%d\n",an);
		printf("Frog Distance = ");
		for(int i=1;i<=n;i++){
			scanf("%lf%lf",&hh[i].x,&hh[i].y);
			
			c[i]=0;
		}
		for(int i=1;i<n;i++){
			for(int j=i+1;j<=n;j++){
				mapp[i][j]=mapp[j][i]=sqrt((hh[i].x-hh[j].x)*(hh[i].x-hh[j].x)+(hh[i].y-hh[j].y)*(hh[i].y-hh[j].y));
			}
		}
		dis[1]=0;
		for(int i=2;i<=n;i++){
			dis[i]=mapp[1][i];
		}
		c[1]=1;
		for(int i=1;i<n;i++){
			int k=-1;
			for(int j=1;j<=n;j++){
				if(c[j]==0&&(k==-1||dis[j]<dis[k])){
					k=j;
				}
			}
			c[k]=1;
			for(int j=1;j<=n;j++){
				dis[j]=min(dis[j],max(dis[k],mapp[k][j]));
			}
			
		}
		printf("%.3lf\n\n",dis[2]);
	}
}


        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值