Poj 2253 Frogger

题目大意:找到从点1到点2的某一条路中最长边,使最长的这条边尽量短。

思路:迪杰斯特拉算法的一个变形应用。通过这道题对于迪杰斯特拉算法有了更进一步的理解。通过数组建立的递推关系,这道题要求源点到达某一个端点的各条路径中最长边的最小值,可以通过暴力列举各条路径的最长边,然后从所有最长边中找到最小值(估计会TLE)。然而通过迪杰斯特拉算法修改其中的递推关系。如果dis[3]=5,dis[4]=8,端点3到端点4的距离为6,则dis[4]=6。

#include <stdio.h>
#include <math.h>
#include <iostream>
using namespace std;
struct position {
	int x;
	int y;
};
#define maxn 250
struct position stone[maxn];
double dis[maxn];
int flag[maxn],n;
double get_length( int x1,int y1,int x2,int y2 ) {
	return sqrt( (double)((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)) );
}
double get_max( double a, double b ) {
	if ( a<b )
		return b;
	return a;
}
void dijsktra() {
	int i,j,k,v;

	for ( i=1;i<=n;i++ ) {
		flag[i]=0;
		dis[i]=get_length(stone[1].x,stone[1].y,stone[i].x,stone[i].y);
	}
	flag[1]=1;
	for ( i=0;i<n;i++ ) {
		k=999999999;
		for ( j=1;j<=n;j++ ) {
			if ( flag[j]==0&&dis[j]<k ) {
				v=j;
				k=dis[j];
			}
		}
		/*迪杰斯特拉算法的思想,求最短路径,通过改变判断条件转化为源点到各个端点的最短路径的最大长度*/
		flag[v]=1;
		for ( j=1;j<=n;j++ ) {
			if ( flag[j]==0&&dis[j]>get_max(dis[v],get_length(stone[v].x,stone[v].y,stone[j].x,stone[j].y)))
				dis[j]=get_max(dis[v],get_length(stone[v].x,stone[v].y,stone[j].x,stone[j].y));
		}

	}
}

int main()
{
	int i,t;

	scanf("%d",&n);
	t=0;
	while ( n!=0 ) {
		for ( i=1;i<=n;i++ )
			scanf("%d%d",&stone[i].x,&stone[i].y);
		t++;
		dijsktra();
		printf("Scenario #%d\nFrog Distance = %.3f\n\n", t,dis[2] );
		scanf("%d",&n);
	}
	return 0;
}


你可能感兴趣的:(Poj 2253 Frogger)