解题(LeatestCarFee -计算最少过路费)

 

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 }
 

猜你喜欢

转载自www.cnblogs.com/hzy1234/p/9890899.html
今日推荐