zoj 1942 Frogger

题目大意,湖中有n个石头,一只青蛙要从一号石头上跳到2号石头上,要使所有可行路径中最大边最小,并输出该最大边。

同zoj1952类似,动态规划,用dist[ i ][ j ]表示从 i 到 j 路径中的最长边,则枚举中间节点 k ,则状态转移方程为dist[ i ][ j ] = min( dist[ i ][ j ] , max(dist[ i ][ k ],dist[ k ][ j ])) ,形式同floyd相同。

#include <stdio.h>
#include <math.h>
double min(double a,double b)
{
	if(a>b) return b;
	else return a;
}
double max(double a,double b)
{
	if(a>b) return a;
	else return b;
}
int n;
double dist[210][210];
double x[210],y[210];
int main()
{
	int i,j,k,sum=0;
	while(1)
	{
		sum++;
		scanf("%d",&n);
		if(n==0)
			break;
		for(i=0;i<n;i++)
			scanf("%lf%lf",&x[i],&y[i]);
		for(i=0;i<n;i++)
			for(j=i+1;j<n;j++)
				dist[i][j]=dist[j][i]=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
		for(k=0;k<n;k++)
			for(i=0;i<n;i++)
				for(j=0;j<n;j++)
					dist[i][j]=min(dist[i][j],max(dist[i][k],dist[k][j]));
		printf("Scenario #%d
",sum);
		printf("Frog Distance = %.3lf
",dist[0][1]);
		printf("
");
	}
	return 0;
}


 

原文地址:https://www.cnblogs.com/vermouth/p/3710222.html