最短路径旅游规划Floyd

最短路径旅游规划Floyd

原题解析:/*

  • 有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。
  • 现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。
  • 如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。
  • 本道题的思想是用最简单的最短路径算法–Floyd算法
  • Floyd可以求任意两点之间的最短距离,利用在两点之间加入其他的点使得两点间得距离最短
  • 这道题因为涉及到距离相同时根据两点之间的价格进行选择,所以在其中需要加上价格的松弛
 * 输入数据
 * 4 5 0 3
 * 0 1 1 20
 * 1 3 2 30
 * 0 3 4 10
 * 0 2 2 20
 * 2 3 1 20
 * 输出数据
 * 3 40

*/

开始解析:

import java.util.*;
public class 最短路径旅游规划Floyd {
     
	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]);
		
	}
}
/*

有问题请联系原博主.

你可能感兴趣的:(蓝桥杯,算法)