关闭

POJ 2253

118人阅读 评论(0) 收藏 举报
分类:

题目大意:有只青蛙要跳到另外一只青蛙那里,路上有许多石头可以供青蛙跳,给出每段石头的坐标,求出青蛙每次要跳的最短距离,也就是说找到一条路径,使得路径上的每个点的距离都小于等于k,求这个最小的k。


思路:最短路径的变种。(网上另有一prim算法为解,并不懂==代码到是差不多)

d[i] 表示从原点到i的k值

dis[i][j]表示i到j的距离

用dijkstra算法 对于每个点更新一下d[i]=min(d[i],max(d[x],dis[x][i])就可以了


//用惯vector作为邻接链表的我,第一次写矩阵版的dijkstra居然不会写===。

原来是要贪心,计算当前最好的那个值

#include <iostream>
	#include <vector>
	#include <cstring>
	#include <iomanip>
	#include <math.h>
	#include <queue>
	#define N 1009
	#define INF 9999999
	using namespace std;
	int arr[N][2];
	double dis[N][N];
	double d[N];
	int n;
	double calc(int i,int j)
	{
		double q=(arr[i][1]-arr[j][1]);
		double t=(arr[i][0]-arr[j][0]);
		return double(sqrt(q*q+t*t));
	}
	int main()
	{
		int cnt=0;n=0;
		while(1)
		{
		
		cin>>n;
		if(n==0)break;
		for (int i=0;i<n;++i)
		{
			cin>>arr[i][0]>>arr[i][1];
			for (int j=0;j<i;++j)
				dis[i][j]=dis[j][i]=calc(i,j);
			dis[i][i]=0;
		}
		
		
		bool vis[N];
	    memset(vis, false, sizeof(vis));
	    
	    vis[0]=1;
	    
		for (int i=1;i<n;++i)d[i]=dis[0][i];
		d[0]=0;
		
		for (int i=0;i<n-1;++i)
		{
		  double temp=INF;int x=0;
		  for (int j=0;j<n;++j)if(!vis[j]&&temp>d[j])temp=d[x=j];
		  vis[x]=1;
		  for (int j=0;j<n;++j)
		  {
		  	if(vis[j])continue;
		  	d[j]=min(max(d[x],dis[x][j]),d[j]);	  	
		  };
	   }
	   
	   
		printf("Scenario #%d\nFrog Distance = %.3f\n\n",++cnt,d[1]);
	    }
		




1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6284次
    • 积分:282
    • 等级:
    • 排名:千里之外
    • 原创:22篇
    • 转载:3篇
    • 译文:0篇
    • 评论:0条