码迷,mamicode.com
首页 > 其他好文 > 详细

PAT 1030

时间:2014-11-02 00:35:35      阅读:241      评论:0      收藏:0      [点我收藏+]

标签:style   blog   io   color   os   ar   java   for   sp   

  dij最短路,这道题稍微麻烦一点的是如果路径长度相同,需要找到cost更小的那条路。在dij最短路中,如果更新到某个节点,发现从该路到这个节点的dist相同,且cost更小,则直接更新cost就可以了。因为只是看该节点的最短路如何,贪心就能过,不知道是不是正确的,如果我自己实现的话肯定是反过来再加一个dfs了,也比较好写。感觉C++在传值,传引用这方面更加灵活,JAVA就很不靠谱的感觉。刚看了一个文章说是scala会取代JAVA,JAVA的确是太庞大了,比起C++来说,直观感觉还是JAVA更大一点。另外JAVA写程序真没什么优势,都要写好长啊... 和C++差不太多,因为要写一个FastReader看起来就更蠢了... 但是没办法o(︶︿︶)o 

  首先还是再写一下dij最短路算法吧。步骤如下

  1. 初始化一个dij_dist数组,数组中将start定为0,其余为MAX

  2. 重复以下过程,直到所有节点都被访问过了

    a. 从未访问过的节点中找到dij_dist值最小的节点,并且将它标记为访问过了

    b. 更新未访问过的节点的dij_dist值,如果graph[least_idx][i] + dij_dist[least_idx] < dij_dist[i],则更新

  对dij_cost的更新放在每次更新dij_dist值的时候,如果dist值相等再比较一下cost值,并更新。

 

  从这道题我想到了,和leetcode很不一样的是,PAT更像ACM一点,如果能够直接用数组开出来空间就不要怕浪费了,无所谓的... 不要强迫症了... 能直接贪心过的也不要管,PAT考完就好了。

  对于我这种不会写JAVA的人来说还是轻松点好..    

  而且这道题很容易过啊= = 耗时最长的一个点才50ms

 

  代码如下

 

  1 import java.io.*;
  2 import java.lang.reflect.Array;
  3 import java.util.*;
  4 
  5 class FastReader{
  6     BufferedReader reader;
  7     StringTokenizer tokenizer;
  8     
  9     public FastReader(InputStream stream){
 10         reader = new BufferedReader(new InputStreamReader(stream), 1 << 10);
 11         tokenizer = null;
 12     }
 13     
 14     public String next(){
 15         while (tokenizer == null || !tokenizer.hasMoreTokens()){
 16             try{
 17                 tokenizer = new StringTokenizer(reader.readLine());
 18             } catch (Exception e){
 19                 throw new RuntimeException(e);
 20             }
 21         }
 22         
 23         return tokenizer.nextToken();
 24     }
 25     
 26     public long next_long(){
 27         return Long.parseLong(next());
 28     }
 29     
 30     public int next_int(){
 31         return Integer.parseInt(next());
 32     }
 33 }
 34 
 35 public class Main {
 36     static int[] dij_dist;
 37     static int[] dij_cost;
 38     
 39     static int[] prev;
 40     static int[][] graph_cost;
 41     static int[][] graph_dist;
 42     static int MAX;
 43     static int N, M, S, D;
 44     
 45     static void dij_calc(){
 46         int start = S;
 47         
 48         dij_dist = new int[N];
 49         dij_cost = new int[N];
 50         prev = new int[N];
 51         
 52         Arrays.fill(dij_dist, Integer.MAX_VALUE);
 53         dij_dist[start] = 0;
 54         dij_cost[start] = 0;
 55         
 56         Set<Integer> done_set = new HashSet<Integer>();
 57         Set<Integer> find_set = new HashSet<Integer>();
 58         
 59         for (int i = 0; i < N; i++)
 60             find_set.add(i);
 61         
 62         while (!find_set.isEmpty()){
 63             Iterator<Integer> it;
 64             
 65             it = find_set.iterator();
 66             int least_dij_dist = MAX;
 67             int least_idx = 0;
 68             while (it.hasNext()){
 69                 int next_idx = it.next();
 70                 if (dij_dist[next_idx] < least_dij_dist){
 71                     least_dij_dist = dij_dist[next_idx];
 72                     least_idx = next_idx;
 73                 }
 74             }
 75             
 76             if (least_dij_dist == MAX || least_idx == D)
 77                 return;
 78             
 79             done_set.add(least_idx);
 80             find_set.remove(least_idx);
 81             
 82             it = find_set.iterator();
 83             while (it.hasNext()){
 84                 int idx = it.next();
 85                 if (least_dij_dist + graph_dist[least_idx][idx] < dij_dist[idx]){
 86                     dij_dist[idx] = least_dij_dist + graph_dist[least_idx][idx];
 87                     dij_cost[idx] = graph_cost[least_idx][idx] + dij_cost[least_idx];
 88                     prev[idx] = least_idx;
 89                 } else if (least_dij_dist + graph_dist[least_idx][idx] == dij_dist[idx]){
 90                     if (graph_cost[least_idx][idx] + dij_cost[least_idx] < dij_cost[idx]){
 91                         dij_cost[idx] = graph_cost[least_idx][idx] + dij_cost[least_idx];
 92                         prev[idx] = least_idx;
 93                     }
 94                 }
 95             }
 96         }
 97     }
 98     
 99     @SuppressWarnings("unchecked")
100     public static void main(String[] args){
101         FastReader reader = new FastReader(System.in);
102         
103         MAX = (1 << 20);
104         
105         N = reader.next_int();
106         M = reader.next_int();
107         S = reader.next_int();
108         D = reader.next_int();
109         
110         graph_cost = new int[N][N];
111         graph_dist = new int[N][N];
112         
113         for (int i = 0; i < N; i++){
114             Arrays.fill(graph_dist[i], MAX);
115             Arrays.fill(graph_cost[i], MAX);
116         }
117         
118         for (int i = 0; i < M; i++){
119             int city1, city2;
120             int dist, cost;
121             
122             city1 = reader.next_int();
123             city2 = reader.next_int();
124             dist = reader.next_int();
125             cost = reader.next_int();
126             
127             graph_dist[city1][city2] = dist;
128             graph_dist[city2][city1] = dist;
129             graph_cost[city1][city2] = cost;
130             graph_cost[city2][city1] = cost;
131         }
132         
133         dij_calc();
134         
135         Stack<Integer> ans_stack = new Stack<Integer>();
136         int idx = D;
137         while (idx != S){
138             ans_stack.push(idx);
139             idx = prev[idx];
140         }
141         ans_stack.push(S);
142         
143         while (!ans_stack.empty())
144             System.out.print(ans_stack.pop() + " ");
145         System.out.println(dij_dist[D] + " " + dij_cost[D]);
146     }
147 }

 

PAT 1030

标签:style   blog   io   color   os   ar   java   for   sp   

原文地址:http://www.cnblogs.com/EpisodeXI/p/4067920.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!