POJ-2253-最短路径变形-java语言描述

做ACM题最大的困难不是不会敲代码!而是理解题意!

看了很多人的帖子,才明白过来是什么意思!

看了博主的才理解什么意思

我再说一下我的理解:求出所有1到2的所有通路,每条通路都有一个最大的子路径,这些子路径中最小的那个就是所求的值!

这是一个无向图,每个顶点都是两两连通的,所以在建图的时候,邻接矩阵的时候只有对角线为0。

我用的是Floyd算法,进行的!

下面看代码:


/*题目大意,有两只青蛙,分别在两个石头上,青蛙A想要到青蛙B那儿去,他可以直接跳到B的石头上,
 * 也可以跳到其他石头上,再从其他石头跳到B那儿,求青蛙从A到B的所有路径中最小的Frog Distance,
 * 我们定义Frog Distance为从A到B的一条路径中所跳的最大距离,例如,如果从A到B某条路径跳的距离是2,5,6,4,
 * 则Frog Distance就是6,题目输入的第一行代表石头的个数,当个数为0时结束程序,接着有n行,
 * 其中第2,3行分别代表A,B青蛙的坐标,其他n-2行分别代表空的石头的坐标,输出一个小数(保留三位),
 * 具体格式参见样例,注意没输出一个答案还要再空一行。
题目数据1很明显为5.000
对于数据2青蛙有两种方案
方案1:1-2则经过距离为2.000故此时Frog Distance=2.000
方案2:1-3-2 则经过距离分别是1.414 1.414 故此时Frog Distance=1.414
故所求的最小的Frog Distance=1.414
*/

import java.io.BufferedInputStream;
import java.util.Scanner;

public class POJ2253 {
	Scanner sc = new Scanner(new BufferedInputStream(System.in));
	int n;
	int cases;
	int stone[][];
	double map[][];

	public void inPut() {
		while (true) {
			cases++;
			n = sc.nextInt();
			if (n == 0) {
				return;
			}
			stone = new int[n][2];
			map = new double[n][n];
			
			for (int i = 0; i < n; i++) {
				stone[i][0] = sc.nextInt();
				stone[i][1] = sc.nextInt();
				
			}
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					map[i][j] = Math.sqrt((stone[i][0] - stone[j][0])
							* (stone[i][0] - stone[j][0])
							+ (stone[i][1] - stone[j][1])
							* (stone[i][1] - stone[j][1]));
					
				}
			}
			
			solve();

		}

	}

	private void solve() {
		// TODO 自动生成的方法存根
		System.out.println("Scenario #" + cases);
		System.out.printf("Frog Distance = %.3f\n\n", floyd());
	}

	private double floyd() {
		// TODO 自动生成的方法存根
		for (int k = 0; k < n; k++) {
			for (int i = 0; i < n; i++) {
				for (int j = 0; j < n; j++) {
					if (map[i][j] > ( map[i][k] > map[k][j] ? map[i][k]
							: map[k][j] ) &&
							map[i][k] != 0 &&
							map[k][j] != 0) {
						map[i][j] = (map[i][k] > map[k][j] ? map[i][k]
								: map[k][j]);
					}
				}
			}
		}
		return map[0][1];
		
	}

	public static void main(String[] args) {
		// TODO 自动生成的方法存根
		new POJ2253().inPut();
	}

}


测试数据:

2
00
34

3
174
194
185
8
11
40
12
22
32
42
30
51
3
910
1010
10010
6
55
100100
44
33
22
11
5
12
21
32
41
52
3
999999
11
33
0


输出结果:


Scenario #1
Frog Distance
=5.000

Scenario #
2
Frog Distance
=1.414

Scenario #
3
Frog Distance
=1.414

Scenario #
4
Frog Distance
=1.000

Scenario #
5
Frog Distance
=134.350

Scenario #
6
Frog Distance
=1.414

Scenario #
7
Frog Distance
=1408.557

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值