Advertisement
Alisator

PAL_22-10_1

Oct 22nd, 2014
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 10.59 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][3]; //aktualni delka do vrcholu, velikost posledni hrany vstoupivsi do vrcholu, delka vcetne predposledni hrany
  27.         edges = new int[M][3]; //vrchol A, vrchol B, delka hrany AB
  28.         int max = 0;
  29.         for (int i = 0; i < M; i++) {
  30.             in = br.readLine().split(" ");
  31.             //x,y,z
  32.             edges[i][0] = Integer.parseInt(in[0]) - 1; //x vertex
  33.             edges[i][1] = Integer.parseInt(in[1]) - 1; //y vertex
  34.             edges[i][2] = Integer.parseInt(in[2]); //distance between x and y
  35.         }
  36.         //sorted by distance
  37.         edges = sortArrayByColumn(2);
  38.  
  39.         for (int i = 0; i < M; i++) {
  40.             //predchozi hrana vrcholu A == soucasna hrana && predchozi hrana vrcholu B == soucasna hrana
  41.             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
  42. //                if (vertexes[edges[i][0]][0] < edges[i][2]) {
  43. //                    vertexes[edges[i][0]][2] = vertexes[edges[i][0]][0];
  44. //                    vertexes[edges[i][0]][0] = edges[i][2];
  45. //                    if (edges[i][2] > max) {
  46. //                        max = edges[i][2];
  47. //                    }
  48. //                }
  49. //                if (vertexes[edges[i][1]][0] < edges[i][2]) {
  50. //                    vertexes[edges[i][1]][2] = vertexes[edges[i][1]][0];
  51. //                    vertexes[edges[i][1]][0] = edges[i][2];
  52. //                    if (edges[i][2] > max) {
  53. //                        max = edges[i][2];
  54. //                    }
  55. //                }
  56.  
  57.                 //minula delka hrany + nova hrana > soucasna
  58.                 if (vertexes[edges[i][0]][2] + edges[i][2] > vertexes[edges[i][1]][0]) {
  59.                     //minula delka hrany nastavena
  60.    //                 System.out.println("double == x1prev +b > x2act");
  61.   //                  System.out.println(edges[i][0] + 1 + " " + edges[i][1] + 1);
  62.  //                   System.out.println(vertexes[edges[i][0]][2] + " " + edges[i][2] + " > " + vertexes[edges[i][1]][0]);
  63.                     vertexes[edges[i][1]][2] = vertexes[edges[i][0]][0];
  64.                     //nova delka nastavena
  65.                     vertexes[edges[i][1]][0] = vertexes[edges[i][0]][2] + edges[i][2];
  66.  //                   System.out.println("nova delka " + vertexes[edges[i][1]][0] + " nova minula hrana " + vertexes[edges[i][1]][2]);
  67.                     if (vertexes[edges[i][0]][2] + edges[i][2] > max) {
  68.                         max = vertexes[edges[i][0]][2] + edges[i][2];
  69.                     }
  70.                 }
  71.  
  72.                 if (vertexes[edges[i][1]][2] + edges[i][2] > vertexes[edges[i][0]][0]) {
  73.                     //minula delka hrany nastavena
  74.    //                 System.out.println("double == x2prev +b > x1act");
  75.    //                 System.out.println(edges[i][0] + 1 + " " + (edges[i][1] + 1));
  76.     //                System.out.println(vertexes[edges[i][1]][2] + " " + edges[i][2] + " > " + vertexes[edges[i][0]][0]);
  77.                     vertexes[edges[i][0]][2] = vertexes[edges[i][1]][0];
  78.                     //nova delka nastavena
  79.                     vertexes[edges[i][0]][0] = vertexes[edges[i][1]][2] + edges[i][2];
  80.  //                   System.out.println("nova delka " + vertexes[edges[i][0]][0] + " nova minula hrana " + vertexes[edges[i][0]][2]);
  81.                     if (vertexes[edges[i][1]][2] + edges[i][2] > max) {
  82.                         max = vertexes[edges[i][1]][2] + edges[i][2];
  83.                     }
  84.                 }
  85.             }
  86.  
  87.             //predchozi hrana vrcholu A && B != soucasna hrana
  88.             if (vertexes[edges[i][0]][1] != edges[i][2] && vertexes[edges[i][1]][1] != edges[i][2]) {
  89.                 int help = vertexes[edges[i][0]][0];
  90.                 //delka ve vrcholu A < nez B + nova cesta
  91.                 if (help < (vertexes[edges[i][1]][0] + edges[i][2])) {
  92.    //                 System.out.println("zadna se nerovna x1act < x2act + b");
  93.   //                  System.out.println(edges[i][0] + 1 + " " + (edges[i][1] + 1));
  94.   //                  System.out.println(vertexes[edges[i][1]][0] + "+" + edges[i][2] + " > " + help);
  95.                     vertexes[edges[i][0]][1] = edges[i][2];
  96.                     vertexes[edges[i][0]][2] = help;
  97.                     vertexes[edges[i][0]][0] = vertexes[edges[i][1]][0] + edges[i][2];
  98.  //                   System.out.println("nova delka " + vertexes[edges[i][0]][0] + " nova minula hrana " + vertexes[edges[i][0]][2]);
  99.                     if (vertexes[edges[i][0]][0] > max) {
  100.                         max = vertexes[edges[i][0]][0];
  101.                     }
  102.                 }
  103.                 //delka ve vrcholu B < nez A + nova cesta
  104.                 if (vertexes[edges[i][1]][0] < (help + edges[i][2])) {
  105.  //                   System.out.println("zadna se nerovna x2act < x1act + b");
  106.  //                   System.out.println(edges[i][0] + 1 + " " + (edges[i][1] + 1));
  107.   //                  System.out.println(help + "+" + edges[i][2] + " > " + vertexes[edges[i][1]][0]);
  108.                     vertexes[edges[i][1]][1] = edges[i][2];
  109.                     vertexes[edges[i][1]][2] = vertexes[edges[i][1]][0];
  110.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  111.  //                   System.out.println("nova delka " + vertexes[edges[i][1]][0] + " nova minula hrana " + vertexes[edges[i][1]][2]);
  112.                     if (vertexes[edges[i][1]][0] > max) {
  113.                         max = vertexes[edges[i][1]][0];
  114.                     }
  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.  
  123.                 if (help + edges[i][2] > vertexes[edges[i][0]][0] && edges[i][2] != vertexes[edges[i][0]][1]) {
  124.  //                   System.out.println("x1 == b, x1<x2+nova hrana");
  125.                     vertexes[edges[i][0]][1] = edges[i][2];
  126.                     vertexes[edges[i][0]][2] = vertexes[edges[i][0]][0];
  127.                     vertexes[edges[i][0]][0] = help + edges[i][2];
  128.  //                   System.out.println("act delka " + vertexes[edges[i][0]][0] + " min hrana " + vertexes[edges[i][0]][2] + "minula delka" + vertexes[edges[i][0]][1]);
  129.                     if (vertexes[edges[i][0]][0] > max) {
  130.                         max = vertexes[edges[i][0]][0];
  131.                     }
  132.                     continue;
  133.                 }
  134.                 if (help < edges[i][2]) {
  135.   //                  System.out.println("x1 == b, x2<b");
  136.                     vertexes[edges[i][1]][1] = edges[i][2];
  137.                     vertexes[edges[i][1]][2] = vertexes[edges[i][1]][0];
  138.                     vertexes[edges[i][1]][0] = edges[i][2];
  139.   //                  System.out.println("act delka " + vertexes[edges[i][1]][0] + " min hrana " + vertexes[edges[i][1]][2] + "minula delka" + vertexes[edges[i][1]][1]);
  140.                     if (vertexes[edges[i][1]][0] > max) {
  141.                         max = vertexes[edges[i][1]][0];
  142.                     }
  143.                     continue;
  144.                 }
  145.  
  146.             }
  147.             //predchozi hrana vrcholu B == soucasna hrana
  148.             if (vertexes[edges[i][1]][1] == edges[i][2]) {
  149.                 int help = vertexes[edges[i][0]][0];
  150.  
  151.                 if (help + edges[i][2] > vertexes[edges[i][1]][0] && edges[i][2] != vertexes[edges[i][1]][1])  {
  152.   //                  System.out.println("x2 == b, x2<b+nova hrana");
  153.                     vertexes[edges[i][1]][1] = edges[i][2];
  154.                     vertexes[edges[i][1]][2] = vertexes[edges[i][0]][0];
  155.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  156.    //                 System.out.println("act delka " + vertexes[edges[i][1]][0] + " min hrana " + vertexes[edges[i][1]][2] + "minula delka" + vertexes[edges[i][1]][1]);
  157.                     if (vertexes[edges[i][1]][0] > max) {
  158.                         max = vertexes[edges[i][1]][0];
  159.                     }
  160.                     continue;
  161.                 }
  162.                 if (help < edges[i][2]) {
  163.   //                  System.out.println("x2 == b, x1<b");
  164.                     vertexes[edges[i][0]][1] = edges[i][2];
  165.                     vertexes[edges[i][0]][2] = vertexes[edges[i][1]][0];
  166.                     vertexes[edges[i][0]][0] = edges[i][2];
  167.  //                   System.out.println("act delka " + vertexes[edges[i][0]][0] + " min hrana " + vertexes[edges[i][0]][2] + "minula delka" + vertexes[edges[i][0]][1]);
  168.                     if (vertexes[edges[i][0]][0] > max) {
  169.                         max = vertexes[edges[i][0]][0];
  170.                     }
  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