Advertisement
Alisator

PAL2-23-10

Oct 23rd, 2014
167
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.14 KB | None | 0 0
  1. package pal;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.IOException;
  5. import java.io.InputStreamReader;
  6.  
  7. /**
  8.  *
  9.  * @author Alisa
  10.  */
  11. public class Main {
  12.  
  13.     static public int N; //hotels counts = |vertexes|
  14.     static public int M; //track counts = |edges|
  15.     static public int[][] edges;
  16.     static public int indexConnection = 0;
  17.     static public boolean notConn = false;
  18.     static public int[][] vertexes;
  19.  
  20.     public static void main(String[] args) throws IOException {
  21.  
  22.         BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  23.         String[] in = br.readLine().split(" ");
  24.         N = Integer.parseInt(in[0]);
  25.         M = Integer.parseInt(in[1]);
  26.         vertexes = new int[N][4]; //aktualni delka do vrcholu, delka posledni hrany vstoupivsi do vrcholu, delka predchozich hrany
  27.         //////////////DADA KOMENT//////////////
  28.         //takze
  29.         //0-aktualni delka
  30.         //1-posledni vstupujici hrana
  31.         //2-posledni velikost kterou dovezla hrana s delkou ktera se rovna akrualni nejvetsi hrane ktera do uzlu vstoupila
  32.         //3-nejvetsi vzdalenost kterou do uzlu dovezla hrana mensi nez nejvetsi ktera do uzlu vstupuje
  33.         //////////////DADA KOMENT//////////////
  34.        
  35.         edges = new int[M][3]; //vrchol A, vrchol B, delka hrany AB
  36.         int max = 0;
  37.         for (int i = 0; i < M; i++) {
  38.             in = br.readLine().split(" ");
  39.             //x,y,z
  40.             edges[i][0] = Integer.parseInt(in[0]) - 1; //x vertex
  41.             edges[i][1] = Integer.parseInt(in[1]) - 1; //y vertex
  42.             edges[i][2] = Integer.parseInt(in[2]); //distance between x and y
  43.         }
  44.         //sorted by distance
  45.         edges = sortArrayByColumn(2);
  46.         for (int i = 0; i < M; i++) {
  47.             int bodA = edges[i][0];
  48.             int bodB = edges[i][1];
  49.             int delkaNoveHrany = edges[i][2];
  50.             int maxDelkaA = vertexes[bodA][0];
  51.             int maxDelkaB = vertexes[bodB][0];
  52.             int delkaSoucHranyA = vertexes[bodA][1];
  53.             int delkaSoucHranyB = vertexes[bodB][1];
  54.             int delkaMinuleHranyA = vertexes[bodA][2];
  55.             int delkaMinuleHranyB = vertexes[bodB][2];
  56.  
  57.             //predchozi hrana vrcholu A == soucasna hrana && predchozi hrana vrcholu B == soucasna hrana
  58.             if (vertexes[edges[i][0]][1] == edges[i][2] && vertexes[edges[i][1]][1] == edges[i][2]) {   //delka do vrcholu A nebo B mensi jak nova hrana -> nahradime ji
  59.                 if (vertexes[edges[i][0]][0] < edges[i][2]) {
  60.                     //////////////DADA KOMENT//////////////
  61.                     //rika ze pokud stejne velka hrana edges[i][2] doveze vetsi vzdalenost(vzdalenost kterou do protejsiho uzlu dovezla hrana mensi nez edges[i][2]) do uzlu vertexes[edges[i][0]][2], zmeni se hodnota dovezena hranou edges[i][2] na danou hodnotu
  62.                     if (vertexes[edges[i][0]][2] < vertexes[edges[i][1]][3] + edges[i][2]) {
  63.                         vertexes[edges[i][0]][2] = vertexes[edges[i][1]][3] + edges[i][2];
  64.                     }
  65.                     //tohle v blede modrym o par radek niz a pro radky 120,140
  66.                     //////////////DADA KOMENT//////////////
  67.  
  68.                     //////////////DADA KOMENT//////////////
  69.                     //pricist hodnotu vertexes[edges[i][1]][3], protoze to je hodnota soucasne hrany + hodnota kterou do protejsi odvezla hrana s mensi velikosti
  70.                     //opet v blede modrem o par radek niz a vsude kde do vertexes[cokoli][0] davas jen edges[i][2]
  71.                     vertexes[edges[i][0]][0] = edges[i][2] + vertexes[edges[i][1]][3];
  72.                     //////////////DADA KOMENT//////////////
  73.                     if (edges[i][2] > max) {
  74.                         max = edges[i][2];
  75.                     }
  76.                 }
  77.                 if (vertexes[edges[i][1]][0] < edges[i][2] + vertexes[edges[i][0]][3]) {
  78.                     vertexes[edges[i][1]][0] = edges[i][2] + vertexes[edges[i][0]][3];
  79.                     if (edges[i][2] > max) {
  80.                         max = edges[i][2];
  81.                     }
  82.                 }
  83.                 continue;
  84.             }
  85.             //predchozi hrana vrcholu A a B != soucasna hrana
  86.             if (vertexes[edges[i][0]][1] != edges[i][2] && vertexes[edges[i][1]][1] != edges[i][2]) {
  87.                 int help = vertexes[edges[i][0]][0];
  88.                 //delka ve vrcholu A < nez B + nova cesta
  89.                 if (help < (vertexes[edges[i][1]][0] + edges[i][2])) {
  90.  
  91.                     //////////////DADA KOMENT//////////////
  92.                     //tady vstupuje na radu vetsi hrana nez tak byla tudiz je potreba se podivat jestli se nemeni nejvesti privedena velikost hranou mensi nez aktualni
  93.                     if (vertexes[edges[i][0]][3] < vertexes[edges[i][0]][2]) {
  94.                         vertexes[edges[i][0]][3] = vertexes[edges[i][0]][2];
  95.                     }
  96.                     //nastavi velikost privedene cesty, aktualni cestou
  97.                     vertexes[edges[i][0]][2] = vertexes[edges[i][0]][1] + edges[i][2];
  98.                     //to same v blede modrem o par radku dal a na radkach 114,133
  99.                     //////////////DADA KOMENT//////////////
  100.  
  101.                     vertexes[edges[i][0]][1] = edges[i][2];
  102.                     vertexes[edges[i][0]][0] = vertexes[edges[i][1]][0] + edges[i][2];
  103.                     if (vertexes[edges[i][0]][0] > max) {
  104.                         max = vertexes[edges[i][0]][0];
  105.                     }
  106.                 }
  107.                 //delka ve vrcholu B < nez A + nova cesta
  108.                 if (vertexes[edges[i][1]][0] < (help + edges[i][2])) {
  109.                     vertexes[edges[i][1]][1] = edges[i][2];
  110.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  111.                        vertexes[edges[i][1]][2] = vertexes[edges[i][1]][1] + edges[i][2];
  112.                
  113.                     if (vertexes[edges[i][1]][0] > max) {
  114.                         max = vertexes[edges[i][1]][0];
  115.                     }
  116.                 }
  117.                 continue;
  118.             }
  119.             //predchozi hrana vrcholu A == soucasna hrana
  120.             if (vertexes[edges[i][0]][1] == edges[i][2]) {
  121.                 int help = vertexes[edges[i][1]][0];
  122.                 if (help < edges[i][2]  + vertexes[edges[i][0]][3]) {
  123.                     vertexes[edges[i][1]][1] = edges[i][2];
  124.                     vertexes[edges[i][1]][0] = edges[i][2] +  + vertexes[edges[i][0]][3];
  125.                     if (vertexes[edges[i][1]][0] > max) {
  126.                         max = vertexes[edges[i][1]][0];
  127.                     }
  128.                 }
  129.                 if (help + edges[i][2] > vertexes[edges[i][0]][0]) {
  130.                     vertexes[edges[i][0]][1] = edges[i][2];
  131.                     vertexes[edges[i][0]][0] = help + edges[i][2];
  132.                        vertexes[edges[i][0]][2] = vertexes[edges[i][0]][1] + edges[i][2];
  133.                  
  134.                     if (vertexes[edges[i][0]][0] > max) {
  135.                         max = vertexes[edges[i][0]][0];
  136.                     }
  137.                 }
  138.                 continue;
  139.             }
  140.             //predchozi hrana vrcholu B == soucasna hrana
  141.             if (vertexes[edges[i][1]][1] == edges[i][2]) {
  142.                 int help = vertexes[edges[i][0]][0];
  143.                 if (help < edges[i][2] + vertexes[edges[i][1]][3]) {
  144.                     vertexes[edges[i][0]][1] = edges[i][2];
  145.                     vertexes[edges[i][0]][0] = edges[i][2] + vertexes[edges[i][1]][3];
  146.                         max = vertexes[edges[i][0]][0];
  147.                     }
  148.            
  149.                 if (help + edges[i][2] > vertexes[edges[i][1]][0]) {
  150.                     vertexes[edges[i][1]][1] = edges[i][2];
  151.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  152.                     if (vertexes[edges[i][1]][0] > max) {
  153.                         max = vertexes[edges[i][1]][0];
  154.                     }
  155.                 }
  156.             }
  157.         }
  158.         System.out.println(max);
  159.     }
  160.     public static int[][] sortArrayByColumn(int column) {
  161.         int[][] sortedArray = new int[M][3];
  162.         int min = edges[0][column];
  163.         int max = edges[0][column];
  164.         //find min and max values for histogram from current column
  165.         for (int i = 1; i < M; i++) {
  166.             if (edges[i][column] < min) {
  167.                 min = edges[i][column];
  168.             } else if (edges[i][column] > max) {
  169.                 max = edges[i][column];
  170.             }
  171.         }
  172.         //histogram length from min to max
  173.         int[] hist = new int[max - min + 1];
  174.         for (int i = 0; i < M; i++) {
  175.             hist[edges[i][column] - min]++;
  176.         }
  177.         //pole vyskytu
  178.         hist[0]--;
  179.         for (int i = 1; i < hist.length; i++) {
  180.             hist[i] = hist[i] + hist[i - 1];
  181.         }
  182.         //min to max
  183.         for (int i = M - 1; i >= 0; i--) {
  184.             int histIndex = edges[i][column] - min;
  185.             int index = hist[histIndex];
  186.             sortedArray[index][column] = edges[i][column];
  187.             sortedArray[index][1] = edges[i][1];
  188.             sortedArray[index][0] = edges[i][0];
  189.             hist[histIndex]--;
  190.         }
  191.         return sortedArray;
  192.     }
  193.  
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement