Advertisement
Alisator

PAL3-5-11

Nov 5th, 2014
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.29 KB | None | 0 0
  1. package pal;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6. import java.util.HashMap;
  7. import java.util.PriorityQueue;
  8. import java.util.Queue;
  9. import java.util.Set;
  10.  
  11. public class Main {
  12.  
  13.     //read
  14.     static public int M; //countOfCities with gas station
  15.     static public int N; //countOfCities without gas station
  16.     static public int H; //highways
  17.     static public int F; //max distance without refueling
  18.     static public int S; //start label
  19.     static public int T; //end label
  20.     //create
  21. //    static public int[][] highways; //matice sousednosti
  22.     static public int[] citiesWeight; //index odpovida label hotelu - weight for dijkstra
  23.     static public boolean[] citiesVisited; // for dijkstra
  24.     static public boolean[] citiesHasGas;
  25.     static public int countOfCities;
  26.     static public Queue dijkstraQ; //fronta pro uchovavani navstivenych vrcholu pro Dijkstru
  27.     //reprezentace grafu
  28.     public static HashMap<Integer, Integer> edgeEnd; //vrchol V a delka hrany
  29.     public static HashMap[] vertices; //vrchol U odpovida indexu pole
  30.     public static HashMap<Integer, Integer> edgeEndGas;
  31.     public static HashMap[] gas;
  32.  
  33.     public static void main(String[] args) throws IOException {
  34.  
  35.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  36.         String[] in = br.readLine().split(" ");
  37.         M = Integer.parseInt(in[0]);
  38.         N = Integer.parseInt(in[1]);
  39.         H = Integer.parseInt(in[2]);
  40.         F = Integer.parseInt(in[3]);
  41.         S = Integer.parseInt(in[4]);
  42.         T = Integer.parseInt(in[5]);
  43.         countOfCities = M + N;
  44. //        highways = new int[countOfCities][countOfCities]; //matice
  45.         edgeEnd = new HashMap<>();
  46.         vertices = new HashMap[countOfCities];
  47.         citiesHasGas = new boolean[countOfCities];
  48.         edgeEndGas = new HashMap<>();
  49.         /////////NEVIM, JAK PORESIT TO, ABY NEMUSELO MIT COUNT OF CITIES VELIKOST
  50.         /////////PROTOZE PAK BY MI INDEX POLE NEODPOVIDAL LABEL VRCHOLU...
  51.         gas = new HashMap[countOfCities];
  52.         /////////
  53.  
  54.         for (int i = 0; i < M; i++) {
  55.             int inM = Integer.parseInt(br.readLine());
  56.             citiesHasGas[inM] = true; //mesto je pumpa
  57.         }
  58.         //mozna udelat for na vertices[x] = new HashMap<>(); a gas = new... jinak null pointer?
  59.         for (int i = 0; i < H; i++) {
  60.             String[] inH = br.readLine().split(" ");
  61.             int x = Integer.parseInt(inH[0]); //x
  62.             int y = Integer.parseInt(inH[1]); //y
  63.             int l = Integer.parseInt(inH[2]); //l
  64.             //mozna nebude potřeba predchozi for nyni?
  65.             if (vertices[x] == null) {
  66.                 vertices[x] = new HashMap<>();
  67.             }
  68.             if (vertices[y] == null) {
  69.                 vertices[y] = new HashMap<>();
  70.             }
  71.             vertices[x].put(y, l);
  72.             vertices[y].put(x, l);
  73.             gas[x] = new HashMap<>();
  74.             gas[y] = new HashMap<>();
  75.         }
  76.         DijkstraCreateNewGraph(S);
  77.         int lengthEnd = Dijkstra(S);
  78.         System.out.println(lengthEnd);
  79.     }
  80.  
  81.     public static void DijkstraCreateNewGraph(int from) {
  82.         //       int[] prev = new int[countOfCities]; //nepotřebujem cestu, jen vahy, vzdalenosti
  83.         dijkstraQ = new PriorityQueue();
  84.         citiesWeight = new int[countOfCities]; //index odpovida label vrcholu, weight
  85.         citiesVisited = new boolean[countOfCities];
  86.         int counIndexOfpump = -1; //INDEXUJEME OD NULY...
  87.         for (int i = 0; i < countOfCities; i++) {
  88.             if (!citiesHasGas[i]) {
  89.                 continue;
  90.             } else {
  91.                 //zaciname jen z pump
  92.                 from = i;
  93.                 System.out.println(i);
  94.                 counIndexOfpump++;
  95.             }
  96.             for (int j = 0; j < countOfCities; j++) {
  97.                 // if (i != from) {//zbytecne kontrola ifu, nastavim start zvlast
  98.                 citiesWeight[j] = Integer.MAX_VALUE;
  99.             }
  100.             citiesWeight[from] = 0;
  101.             dijkstraQ.add(from);
  102.  
  103.             while (!dijkstraQ.isEmpty()) {
  104.                 //poll retrieves and remove element... u priority the lowest one
  105.                 int u = (int) dijkstraQ.poll();
  106.                 citiesVisited[u] = true; //visited
  107.                 //
  108.                 dijkstraQ.remove(u);
  109.                 // if(citiesWeight[u] == Integer.MAX) break; //nedostupny vrchol
  110.                 //pro kazdyho souseda v vrcholu u
  111.                 Set<Integer> keys = vertices[u].keySet();
  112.                 for (Integer v : keys) {//jestli soused v nebyl navstiven
  113.                     if (citiesVisited[v] == false) {//spocitej help = citiesWeight[u] + delka mezi uv
  114.                         int length = citiesWeight[u] + (int) vertices[u].get(v);
  115. //                        System.out.println("pred kontrolou " + u + " a " + v + " delka " + length);
  116.                         if (length < citiesWeight[v] && length <= F && citiesHasGas[v]) {   //nastav novou dvahu pro v a jeho predka, pokud staci delka paliva na cestu mezi pumpama
  117.                             // u a v pumpy, pridej je do noveho redukovaneho grafu
  118.                             gas[u].put(v, length);
  119.                             System.out.println(gas[u]);
  120.                             citiesWeight[v] = length;
  121.                             //prev[v] = u;                        
  122.                         }
  123.                     }
  124.                 }
  125.             }
  126.         }
  127.     }
  128.  
  129.     public static int Dijkstra(int from) {
  130.         //       int[] prev = new int[countOfCities]; //nepotřebujem cestu, jen vahy, vzdalenosti
  131.         //vsechny promenne znova instancujeme
  132.         dijkstraQ = new PriorityQueue();
  133.         //vetsi pole, ale index odovida labelu vrcholu... jinak bych musela v tom poli hledat nejak, tak nevim, co s tim?
  134.         citiesWeight = new int[countOfCities]; //index odpovida label vrcholu, weight
  135.         citiesVisited = new boolean[countOfCities];
  136.  
  137.         for (int j = 0; j < countOfCities; j++) {
  138.             citiesWeight[j] = Integer.MAX_VALUE;
  139.         }
  140.         citiesWeight[from] = 0;
  141.         dijkstraQ.add(from);
  142.  
  143.         while (!dijkstraQ.isEmpty()) {
  144.             int u = (int) dijkstraQ.poll();
  145.             citiesVisited[u] = true; //visited
  146. //            System.out.println(u);
  147.             dijkstraQ.remove(u);
  148.             // if(citiesWeight[u] == Integer.MAX) break; //nedostupny vrchol
  149.             //pro kazdyho souseda v vrcholu u
  150.             Set<Integer> keys = gas[u].keySet();
  151.             System.out.println(keys);
  152.             for (Integer v : keys) {//jestli soused v nebyl navstiven
  153.                
  154.                 if (citiesVisited[v] == false) {//spocitej help = citiesWeight[u] + delka mezi uv
  155.                     int length = citiesWeight[u] + (int) gas[u].get(v);
  156. ////                    System.out.println("pred kontrolou " + u + " a " + v + " delka " + length);
  157. ///////TENHLE DIJKSTRA NEJAK NEFUNGUJE///////
  158.                     if (length < citiesWeight[v]) {   //nastav novou dvahu pro v a jeho predka
  159.                         citiesWeight[v] = length;
  160.                         //prev[v] = u;
  161.                         dijkstraQ.add(v);
  162.                     }
  163.                 }
  164.             }
  165.         }
  166.         return citiesWeight[T];
  167.     }
  168. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement