POJ 2253 Frogger (DIJKSTRA)

修改条件的DIJKSTRA。。。这都搞了一下午。。。郁闷了。。。

松弛条件修改为:dist[i]=max(dist[minp],edge[minp][i])  (dist用来记录构成路径的最短边集合中的最长边(很绕口啊。。。公认的))

还有   要注意边界处理   先把dist[i]设置为edge[0][i] 

呃。。大概就这么多。。好久不写最短路了。。缺乏练习啊。。

#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAXN 210
#define inf 1000000000

struct Tpoint {
	double x,y;
} point[MAXN];

double edge[MAXN][MAXN];
double dist[MAXN];
int used[MAXN];

int n;

double max(double a,double b)
{
	return a>b? a:b;
}

double length(Tpoint a, Tpoint b)
{
	return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}

void addedge(int i,int j)
{
	edge[i][j]=length(point[i],point[j]);
}

void dijkstra()
{
	memset(used,0,sizeof(used));
	for(int i=0; i<n; i++)
		dist[i]=edge[0][i];
	
	dist[0]=0;
	used[0]=1;
	
	for(int i=0; i<n; i++) {
		
		double min=inf;
		int minp;
		
		for(int j=0; j<n; j++) {
			if(!used[j] && dist[j]<min) {
				min=dist[j];
				minp=j;
			}
		}
		
		used[minp]=1;
		
		if(min==inf) break;
		
		for(int j=0; j<n; j++) {
			if(!used[j] && max(dist[minp],edge[minp][j]) < dist[j]) {
				dist[j] = max(dist[minp],edge[minp][j]);
			}
		}
		
	}
	
	
}

int main()
{
	int ppp=1;
	while(scanf("%d",&n),n) {
		
		for(int i=0; i<n; i++)
			for(int j=0; j<n; j++)
				edge[i][j]=inf;
		
		for(int i=0; i<n; i++) {
			scanf("%lf%lf",&point[i].x,&point[i].y);
			for(int j=0; j<i; j++) {
				addedge(j,i);
				addedge(i,j);
			}
		}
		
		//test
		//for(int i=0; i<n; i++)
		//	for(int j=0; j<n; j++)
		//		if(edge[i][j]<inf)
		//			printf("%d %d %.0f %.0f %.0f %.0f %.3f\n",i,j,point[i].x,point[i].y,point[j].x,point[j].y,edge[i][j]);
		
		dijkstra();
		printf("Scenario #%d\nFrog Distance = %.3f\n\n",ppp++,dist[1]);
		//for (int i=0; i<n; i++) {
		//	printf("%.3lf\n",dist[i]);
		//}
	}
}

posted on 2011-07-17 23:50  Eucalyptus  阅读(240)  评论(0编辑  收藏  举报