首页 > 代码库 > UVa 10803 - Thunder Mountain

UVa 10803 - Thunder Mountain

題目:給你平面上的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