Advertisement
Alisator

PAL2_22-10_7z10

Oct 21st, 2014
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.80 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, delka posledni hrany vstoupivsi do vrcholu, delka predchozich 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.         for (int i = 0; i < M; i++) {
  39.             int bodA = edges[i][0];
  40.             int bodB = edges[i][1];
  41.             int delkaNoveHrany = edges[i][2];
  42.             int maxDelkaA = vertexes[bodA][0];
  43.             int maxDelkaB = vertexes[bodB][0];
  44.             int delkaSoucHranyA = vertexes[bodA][1];
  45.             int delkaSoucHranyB = vertexes[bodB][1];
  46.             int delkaMinuleHranyA = vertexes[bodA][2];
  47.             int delkaMinuleHranyB = vertexes[bodB][2];
  48.  
  49.             //predchozi hrana vrcholu A == soucasna hrana && predchozi hrana vrcholu B == soucasna hrana
  50.             if (delkaSoucHranyA == delkaNoveHrany && delkaSoucHranyB == delkaNoveHrany) {   //delka do vrcholu A nebo B mensi jak nova hrana -> nahradime ji
  51.                 if (maxDelkaA < delkaNoveHrany) {
  52.                     delkaMinuleHranyA = delkaSoucHranyA;
  53.                     maxDelkaA = delkaNoveHrany;
  54.                     if (maxDelkaA > max) {
  55.                         max = maxDelkaA;
  56.                     }
  57.                 }
  58.                 if (maxDelkaB < delkaNoveHrany) {
  59.                     delkaMinuleHranyB = delkaSoucHranyB;
  60.                     maxDelkaB = delkaNoveHrany;
  61.                     if (maxDelkaB > max) {
  62.                         max = maxDelkaB;
  63.                     }
  64.                 }
  65.                 continue;
  66.             }
  67.             //predchozi hrana vrcholu A a zaroven B != soucasna hrana
  68.             if (delkaSoucHranyA != delkaNoveHrany && delkaSoucHranyB != delkaNoveHrany) {
  69.                 int help = delkaSoucHranyA;
  70.                 //delka ve vrcholu A < nez B + nova cesta
  71.                 if (help < (delkaMinuleHranyB + delkaNoveHrany)) {
  72.                     delkaMinuleHranyB = delkaSoucHranyA;
  73.                     delkaSoucHranyA = delkaNoveHrany;
  74.                     maxDelkaA = delkaSoucHranyB + delkaNoveHrany;
  75.                     if (maxDelkaA > max) {
  76.                         max = maxDelkaA;
  77.                     }
  78.                 }
  79.                 //delka ve vrcholu B < nez A + nova cesta
  80.                 if (vertexes[edges[i][1]][0] < (help + edges[i][2])) {
  81.                     vertexes[edges[i][1]][1] = edges[i][2];
  82.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  83.                     if (vertexes[edges[i][1]][0] > max) {
  84.                         max = vertexes[edges[i][1]][0];
  85.                     }
  86.                     System.out.println(vertexes[edges[i][0]][0] + " " + vertexes[edges[i][1]][0]);
  87.                     System.out.println(vertexes[edges[i][0]][1] + " " + vertexes[edges[i][1]][1]);
  88.                 }
  89.                 continue;
  90.             }
  91.             //predchozi hrana vrcholu A == soucasna hrana
  92.             if (vertexes[edges[i][0]][1] == edges[i][2]) {
  93.                 int help = vertexes[edges[i][1]][0];
  94.                 if (help < edges[i][2]) {
  95.                     System.out.println("x2 < b, a==b");
  96.                 }
  97.                 System.out.println(vertexes[edges[i][0]][0] + " " + vertexes[edges[i][1]][0]);
  98.                 System.out.println(vertexes[edges[i][0]][1] + " " + vertexes[edges[i][1]][1]);
  99.                 {
  100.                     vertexes[edges[i][1]][1] = edges[i][2];
  101.                     vertexes[edges[i][1]][0] = edges[i][2];
  102.                     if (vertexes[edges[i][1]][0] > max) {
  103.                         max = vertexes[edges[i][1]][0];
  104.                     }
  105.                     System.out.println(vertexes[edges[i][0]][0] + " " + vertexes[edges[i][1]][0]);
  106.                     System.out.println(vertexes[edges[i][0]][1] + " " + vertexes[edges[i][1]][1]);
  107.                 }
  108.                 if (help + edges[i][2] > vertexes[edges[i][0]][0]) {
  109.                     System.out.println("x1 < b + x2, a==b");
  110.                     System.out.println(vertexes[edges[i][0]][0] + " " + vertexes[edges[i][1]][0]);
  111.                     System.out.println(vertexes[edges[i][0]][1] + " " + vertexes[edges[i][1]][1]);
  112.                     vertexes[edges[i][0]][1] = edges[i][2];
  113.                     vertexes[edges[i][0]][0] = help + edges[i][2];
  114.                     if (vertexes[edges[i][0]][0] > max) {
  115.                         max = vertexes[edges[i][0]][0];
  116.                     }
  117.                     System.out.println(vertexes[edges[i][0]][0] + " " + vertexes[edges[i][1]][0]);
  118.                     System.out.println(vertexes[edges[i][0]][1] + " " + vertexes[edges[i][1]][1]);
  119.                 }
  120.                 continue;
  121.             }
  122.             //predchozi hrana vrcholu B == soucasna hrana
  123.             if (vertexes[edges[i][1]][1] == edges[i][2]) {
  124.                 int help = vertexes[edges[i][0]][0];
  125.                 if (help < edges[i][2]) {
  126.                     vertexes[edges[i][0]][1] = edges[i][2];
  127.                     vertexes[edges[i][0]][0] = edges[i][2];
  128.                     if (vertexes[edges[i][0]][0] > max) {
  129.                         max = vertexes[edges[i][0]][0];
  130.                     }
  131.                 }
  132.                 if (help + edges[i][2] > vertexes[edges[i][1]][0]) {
  133.                     vertexes[edges[i][1]][1] = edges[i][2];
  134.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  135.                     if (vertexes[edges[i][1]][0] > max) {
  136.                         max = vertexes[edges[i][1]][0];
  137.                     }
  138.                 }
  139.             }
  140.         }
  141.         System.out.println(max);
  142.     }
  143.  
  144.     public static int[][] sortArrayByColumn(int column) {
  145.         int[][] sortedArray = new int[M][3];
  146.         int min = edges[0][column];
  147.         int max = edges[0][column];
  148.         //find min and max values for histogram from current column
  149.         for (int i = 1; i < M; i++) {
  150.             if (edges[i][column] < min) {
  151.                 min = edges[i][column];
  152.             } else if (edges[i][column] > max) {
  153.                 max = edges[i][column];
  154.             }
  155.         }
  156.         //histogram length from min to max
  157.         int[] hist = new int[max - min + 1];
  158.         for (int i = 0; i < M; i++) {
  159.             hist[edges[i][column] - min]++;
  160.         }
  161.         //pole vyskytu
  162.         hist[0]--;
  163.         for (int i = 1; i < hist.length; i++) {
  164.             hist[i] = hist[i] + hist[i - 1];
  165.         }
  166.         //min to max
  167.         for (int i = M - 1; i >= 0; i--) {
  168.             int histIndex = edges[i][column] - min;
  169.             int index = hist[histIndex];
  170.             sortedArray[index][column] = edges[i][column];
  171.             sortedArray[index][1] = edges[i][1];
  172.             sortedArray[index][0] = edges[i][0];
  173.             hist[histIndex]--;
  174.         }
  175.         return sortedArray;
  176.     }
  177.  
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement