NowCoder今年买了一辆新车,他决定自己开车回家过年。回家过程中要经过ň个大小收费站,每个收费站的费用不同,你能帮他计算一下最少需要给多少过路费吗?
输入描述:
输入包含多组数据,每组数据第一行包含两个正整数M(1≤m≤500)和N(1≤n≤30),其中Ñ表示有Ñ个收费站,编号依次为1,2 ,...,n。出发地的编号为0,终点的编号为n,即需要从0到n。
紧接着m行,每行包含三个整数f,t,c,(0≤f,t≤n ; 1≤c≤10),分别表示从编号为˚F的地方开到吨,需要交Ç元的过路费。
输出描述:
对应每组数据,请输出至少需要交多少过路费。
示例1
输入
8 4
0 1 10
0 2 5
1 2 2
1 3 1
2 1 3
2 3 9
2 4 2
3 4 4
输出
7
代码如下:
1 package com.yzh.hehe; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 import java.util.Scanner; 6 7 8 public class LeatestCarFee { 9 10 public static void main(String[] args) { 11 Scanner scanner=new Scanner(System.in); 12 while (scanner.hasNext()) { 13 String string=scanner.nextLine(); 14 int m =Integer.valueOf(string.split("\\s+")[0]); 15 int n =Integer.valueOf(string.split("\\s+")[1]); 16 List<FeeLine>[] arr = new List[n]; 17 for (int i = 0; i < arr.length; i++) { 18 arr[i]=new ArrayList<FeeLine>(); 19 } 20 for (int i = 0; i < m; i++) { 21 string=scanner.nextLine(); 22 String[] sArr = string.split("\\s+"); 23 makeGraph(arr, sArr); 24 } 25 System.out.println(leatestCarFee(arr)); 26 } 27 scanner.close(); 28 29 30 } 31 32 private static int leatestCarFee(List<FeeLine>[] arr) { 33 int[] costArr = new int[arr.length+1];//记录起点到各点的最小值 34 //索引0位置的值设为0(初始值) 35 for (int i = 1; i < costArr.length; i++) { 36 costArr[i]=Integer.MAX_VALUE; 37 } 38 int[] findArr=new int[arr.length+1];//是否被找到值得点 39 int aim = 0; 40 while (aim!=arr.length) { 41 findArr[aim]=1; 42 aim=getLeatest(costArr, aim, arr,findArr); 43 } 44 return costArr[aim]; 45 46 } 47 48 //首先找到离起点值最小(v)的点(m),点m与起点的最小值即为v,再把v与点m的邻接点(n...)的值相加和起点到这些点(n...)的值作比较更新 49 //重复以上步骤找出所求点到起点的最小值 50 private static int getLeatest(int[] costArr, int point, List<FeeLine>[] arr,int[] findArr) { 51 int size=arr[point].size(); 52 int pFee=costArr[point]; 53 for (int i = 0; i < size; i++) { 54 FeeLine feeLine=arr[point].get(i); 55 if (feeLine.fee+pFee<costArr[feeLine.point]) { 56 costArr[feeLine.point]=feeLine.fee+pFee; 57 } 58 } 59 FeeLine rec=new FeeLine(Integer.MAX_VALUE, Integer.MAX_VALUE); 60 for (int i = 1; i < costArr.length; i++) { 61 if (costArr[i]<rec.fee&&findArr[i]!=1) { 62 rec.fee=costArr[i]; 63 rec.point=i; 64 } 65 } 66 return rec.point; 67 } 68 69 70 71 private static void makeGraph(List<FeeLine>[] arr,String[] sArr ) { 72 FeeLine feeLine=new FeeLine(Integer.valueOf(sArr[1]), Integer.valueOf(sArr[2])); 73 arr[Integer.valueOf(sArr[0])].add(feeLine); 74 } 75 76 77 78 } 79 80 81 82 83 class FeeLine { 84 int point; 85 int fee; 86 FeeLine(int point,int fee){ 87 this.point=point; 88 this.fee=fee; 89 } 90 }