码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 10803 - Thunder Mountain

时间:2015-07-09 11:26:09      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

題目:給你平面上的n個點(笛卡爾坐標),每個點之間都有連線,如果距離超過10就認為斷開;

            請你給出所有點間最短距離的最大值。

分析:最短路。多源最短路使用floyd算法。

            首先建圖,然後將大於10的邊都定義成oo,求解最短路,輸出最短路中的最大值即可。

說明:距離700題還有40題╮(╯▽╰)╭。

#include <cstring>
#include <cstdio>
#include <cmath>

const double oo = 50000;

typedef struct _point
{
	double x,y;
}point;
point  P[101];

double dist[101][101];

int main()
{
	int T,n;
	while (~scanf("%d",&T)) 
	for (int t = 1; t <= T; ++ t) {
		//input
		scanf("%d",&n);
		for (int i = 0; i < n; ++ i)
			scanf("%lf%lf",&P[i].x,&P[i].y);
		//initial
		for (int i = 0; i < n; ++ i)
		for (int j = 0; j < n; ++ j) {
			dist[i][j] = sqrt((P[i].x-P[j].x)*(P[i].x-P[j].x)+(P[i].y-P[j].y)*(P[i].y-P[j].y));
			if (dist[i][j] > 10.0)
				dist[i][j] = oo;
		}
		//floyd
		for (int k = 0; k < n; ++ k)
		for (int i = 0; i < n; ++ i)
		for (int j = 0; j < n; ++ j)
			if (dist[i][j] > dist[i][k]+dist[k][j])
				dist[i][j] = dist[i][k]+dist[k][j];
		//find max
		double Max = 0;
		for (int i = 0; i < n; ++ i)
		for (int j = 0; j < n; ++ j)
			if (Max < dist[i][j])
				Max = dist[i][j];
		//output
		printf("Case #%d:\n",t);
		if (Max == oo)
			printf("Send Kurdy\n\n");
		else printf("%.4lf\n\n",Max);
	}
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

UVa 10803 - Thunder Mountain

标签:

原文地址:http://blog.csdn.net/mobius_strip/article/details/46812627

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!