PTA7-10 最短路径之旅游规划-【JAVA】

本道题的思想是用最简单的最短路径算法–Floyd算法

现有一张自驾旅游路线图,通过地图你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。(注:该题目来源于浙江大学陈越老师题目,因为Java编译的时间和内存限制问题,暂时新增题目以便通过,如有能减少消耗的,也请不吝指导。)

输入格式:

输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2≤N≤500)是城市的个数,顺便假设城市的编号为0~(N−1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

输出格式:

在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

输入样例:

在这里给出一组输入。例如:

6 8 1 5
0 1 3 20
1 2 2 10
0 3 4 10
1 5 12 90
2 4 3 40
4 5 5 30
3 5 7 50
2 3 9 30

输出样例:

在这里给出相应的输出。例如:

10 80 

分析:

有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。
现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。
如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

Floyd可以求任意两点之间的最短距离,利用在两点之间加入其他的点使得两点间得距离最短
这道题因为涉及到距离相同时根据两点之间的价格进行选择,所以在其中需要加上价格的松弛
 

代码实现:

import java.util.*;
public class Main {
	public static int inf = 99999999;
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		
		//输入数据
		String[] s1 = sc.nextLine().split(" ");
		int n = Integer.parseInt(s1[0]);
		int m = Integer.parseInt(s1[1]);
		int a = Integer.parseInt(s1[2]);
		int b = Integer.parseInt(s1[3]);
		
		int[][] e = new int[505][505];
		int[][] price = new int[505][505];
		
		//初始化
		for(int i = 0;i< n;i++)
			for(int j = 0;j<n;j++)
			{
				if(i==j)
					e[i][j] = 0;
				else
					e[i][j] = inf;
			}
		for(int i = 0;i< n;i++)
			for(int j = 0;j<n;j++)
			{
				price[i][j] = inf;
			}
		
		//输入路的信息和价格的信息
		for(int i=0;i<m;i++)
		{
			String[] s2 = sc.nextLine().split(" ");
			int t1 = Integer.parseInt(s2[0]);
			int t2 = Integer.parseInt(s2[1]);
			int t3 = Integer.parseInt(s2[2]);
			int t4 = Integer.parseInt(s2[3]);
			
			e[t1][t2] = t3;
			e[t2][t1] = t3;
			price[t1][t2] = t4;
			price[t2][t1] = t4;
		}
		
		//Floyd
		for(int k = 0;k < n;k++)
			for(int i=0;i<n;i++)
				for(int j = 0;j<n;j++)
				{
					if(e[i][j] > e[i][k] + e[k][j])
					{
						e[i][j] = e[i][k] + e[k][j];
						price[i][j]=price[i][k] + price[k][j];
					}
					else if(e[i][j] == e[i][k] + e[k][j])
					{
						if(price[i][j] > price[i][k] + price[k][j])
							price[i][j]=price[i][k] + price[k][j];
					}
				}
		
		System.out.println(e[a][b]+" "+price[a][b]);
		
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值