POJ 2253

题目大意:有只青蛙要跳到另外一只青蛙那里,路上有许多石头可以供青蛙跳,给出每段石头的坐标,求出青蛙每次要跳的最短距离,也就是说找到一条路径,使得路径上的每个点的距离都小于等于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]);
	    }
		




阅读更多
上一篇poj 3259
下一篇poj 1125
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭