关闭

UVa 10803 - Thunder Mountain

473人阅读 评论(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;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:842965次
    • 积分:19114
    • 等级:
    • 排名:第453名
    • 原创:1116篇
    • 转载:0篇
    • 译文:0篇
    • 评论:246条
    文章分类
    最新评论