Advertisement
Alisator

renamePAL2

Oct 22nd, 2014
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.38 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]); //x vertex
  41.             edges[i][1] = Integer.parseInt(in[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 posledniHranaA = vertexes[bodA][1];
  53.             int posledniHranaB = vertexes[bodB][1];
  54.             int delkaPosledniHranaA = vertexes[bodA][2];
  55.             int delkaPosledniHranaB = vertexes[bodB][2];
  56.             int delkaMinulaHranaA = vertexes[bodA][3];
  57.             int delkaMinulaHranaB = vertexes[bodB][3];
  58.  
  59.             //predchozi hrana vrcholu A == soucasna hrana && predchozi hrana vrcholu B == soucasna hrana
  60.             if (posledniHranaA == delkaNoveHrany && posledniHranaB == delkaNoveHrany) {   //delka do vrcholu A nebo B mensi jak nova hrana -> nahradime ji
  61.                 if (maxDelkaA < delkaNoveHrany) {
  62.                     if (delkaPosledniHranaB < delkaMinulaHranaB + delkaNoveHrany) {
  63.                         delkaPosledniHranaB = delkaMinulaHranaB + delkaNoveHrany;
  64.                     }
  65. //////////////////////DADA KOMENT ///////////////  
  66. //tady musis jeste pricist tu hodnotu z vertexes[cokoli][3]. To samy i o cca 15 radku niz                  
  67.                     maxDelkaA = delkaNoveHrany + delkaMinulaHranaA;
  68. //////////////////////DADA KOMENT ///////////////                      
  69.                     if (delkaNoveHrany > max) {
  70.                         max = delkaNoveHrany;
  71.                     }
  72.                 }
  73.                 if (maxDelkaB < delkaNoveHrany + delkaMinulaHranaB) {
  74. //////////////////////DADA KOMENT ///////////////  
  75. //prepis si na spravny promeny je to to samy co o par radku vysse jen s hodnotama pro druhej uzel          
  76.                     if (delkaPosledniHranaA < delkaMinulaHranaA + delkaNoveHrany) {
  77.                         delkaPosledniHranaB= delkaMinulaHranaA + delkaNoveHrany;
  78.                     }  
  79. //////////////////////DADA KOMENT ///////////////                      
  80.                     maxDelkaB = delkaNoveHrany+posledniHranaB;
  81.                     if (delkaNoveHrany > max) {
  82.                         max = delkaNoveHrany;
  83.                     }
  84.                 }
  85.                 continue;
  86.             }
  87.             //predchozi hrana vrcholu A a B != soucasna hrana
  88.             if (posledniHranaA != delkaNoveHrany && posledniHranaB != delkaNoveHrany) {
  89.                 int help = maxDelkaA;
  90.                 //delka ve vrcholu A < nez B + nova cesta
  91.                 if (help < (maxDelkaB + delkaNoveHrany)) {
  92. //////////////////////DADA KOMENT ///////////////  
  93. //tohle stejny jen pro druhy vrchol opet asi o 15 radku niz
  94.                     if (delkaMinulaHranaA < delkaPosledniHranaA) {
  95.                         delkaMinulaHranaA = delkaPosledniHranaA;
  96.                     }
  97.                     //nastavi velikost privedene cesty, aktualni cestou
  98.                     delkaPosledniHranaA = posledniHranaA + delkaNoveHrany;
  99. //////////////////////DADA KOMENT ///////////////                      
  100.                     posledniHranaA = delkaNoveHrany;                   
  101.                     maxDelkaA = maxDelkaB + delkaNoveHrany;
  102.                     if (maxDelkaA > max) {
  103.                         max = maxDelkaA;
  104.                     }
  105.                 }
  106.                 //delka ve vrcholu B < nez A + nova cesta
  107.                 if (maxDelkaB < (help + delkaNoveHrany)) {
  108.                     posledniHranaB = delkaNoveHrany;
  109.                     maxDelkaB = help + delkaNoveHrany;
  110.                     if (maxDelkaB > max) {
  111.                         max = maxDelkaB;
  112.                     }
  113.                     delkaPosledniHranaA = posledniHranaA + delkaNoveHrany;
  114.                 }
  115.                 continue;
  116.             }
  117.             //predchozi hrana vrcholu A == soucasna hrana
  118.             if (posledniHranaA == delkaNoveHrany) {
  119.                 int help = maxDelkaB;
  120.                 if (help < delkaNoveHrany + delkaMinulaHranaB) {
  121.                     if (delkaPosledniHranaB < delkaMinulaHranaB + delkaNoveHrany) {
  122.                         delkaPosledniHranaB = delkaMinulaHranaB + delkaNoveHrany;
  123.                     }
  124.                     delkaPosledniHranaB = posledniHranaB + delkaNoveHrany;
  125.                     posledniHranaB = delkaNoveHrany;
  126.                     maxDelkaB = delkaNoveHrany;
  127.                     if (maxDelkaB > max) {
  128.                         max = maxDelkaB;
  129.                     }
  130.                 }
  131.                 if (help + delkaNoveHrany > maxDelkaA) {
  132. //////////////////////DADA KOMENT ///////////////  
  133. //tady ti chybi zase ten jeden if, ted nevim presne kterej po prejmenovani se v tom ztracim
  134. //////////////////////DADA KOMENT ///////////////  
  135.                     if (delkaPosledniHranaA < delkaMinulaHranaA + delkaNoveHrany) {
  136.                         delkaPosledniHranaA = delkaMinulaHranaA + delkaNoveHrany;
  137.                     }
  138.                     delkaPosledniHranaA = posledniHranaA + delkaNoveHrany;
  139.                     posledniHranaA = delkaNoveHrany;
  140.                     maxDelkaA = help + delkaNoveHrany;
  141.                     if (maxDelkaA > max) {
  142.                         max = maxDelkaA;
  143.                     }
  144.                 }
  145.                 continue;
  146.             }
  147.             //predchozi hrana vrcholu B == soucasna hrana
  148.             if (posledniHranaB == delkaNoveHrany) {
  149.                 int help = maxDelkaA;
  150.                 if (help < delkaNoveHrany + delkaMinulaHranaA) {
  151.                     if (delkaPosledniHranaA < delkaMinulaHranaA + delkaNoveHrany) {
  152.                         delkaPosledniHranaA = delkaMinulaHranaA + delkaNoveHrany;
  153.                     }
  154.                     posledniHranaA = delkaNoveHrany;
  155.                     maxDelkaA = delkaNoveHrany;
  156.                     if (maxDelkaA > max) {
  157.                         max = maxDelkaA;
  158.                     }
  159.                 }
  160.                 if (help + delkaNoveHrany > maxDelkaB) {
  161. //////////////////////DADA KOMENT ///////////////  
  162. //tady ti chybi zase ten jeden if, ted nevim presne kterej po prejmenovani se v tom ztracim
  163. //////////////////////DADA KOMENT ///////////////\
  164.                    if (delkaPosledniHranaB < delkaMinulaHranaB + delkaNoveHrany) {
  165.                         delkaPosledniHranaB = delkaMinulaHranaB + delkaNoveHrany;
  166.                     }
  167.                     posledniHranaB = delkaNoveHrany;
  168.                     maxDelkaB = help + delkaNoveHrany;
  169.                     if (maxDelkaB > max) {
  170.                         max = maxDelkaB;
  171.                     }
  172.                 }
  173.             }
  174.         }
  175.         System.out.println(max);
  176.     }
  177.  
  178.     public static int[][] sortArrayByColumn(int column) {
  179.         int[][] sortedArray = new int[M][3];
  180.         int min = edges[0][column];
  181.         int max = edges[0][column];
  182.         //find min and max values for histogram from current column
  183.         for (int i = 1; i < M; i++) {
  184.             if (edges[i][column] < min) {
  185.                 min = edges[i][column];
  186.             } else if (edges[i][column] > max) {
  187.                 max = edges[i][column];
  188.             }
  189.         }
  190.         //histogram length from min to max
  191.         int[] hist = new int[max - min + 1];
  192.         for (int i = 0; i < M; i++) {
  193.             hist[edges[i][column] - min]++;
  194.         }
  195.         //pole vyskytu
  196.         hist[0]--;
  197.         for (int i = 1; i < hist.length; i++) {
  198.             hist[i] = hist[i] + hist[i - 1];
  199.         }
  200.         //min to max
  201.         for (int i = M - 1; i >= 0; i--) {
  202.             int histIndex = edges[i][column] - min;
  203.             int index = hist[histIndex];
  204.             sortedArray[index][column] = edges[i][column];
  205.             sortedArray[index][1] = edges[i][1];
  206.             sortedArray[index][0] = edges[i][0];
  207.             hist[histIndex]--;
  208.         }
  209.         return sortedArray;
  210.     }
  211.  
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement