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;
}


阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/mobius_strip/article/details/46812627
个人分类: 解题报告 图论
上一篇UVa 11371 - Number Theory for Newbies
下一篇UVa 11475 - Extend to Palindrome
想对作者说点什么? 我来说一句

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

关闭
关闭