Advertisement
Alisator

PAL2_6

Oct 20th, 2014
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 6.21 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][2]; //aktualni delka do vrcholu, delka posledni hrany vstoupivsi do vrcholu
  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]][0] = edges[i][2];
  44.                     if (edges[i][2] > max) {
  45.                         max = edges[i][2];
  46.                     }
  47.                 }
  48.                 if (vertexes[edges[i][1]][0] < edges[i][2]) {
  49.                     vertexes[edges[i][1]][0] = edges[i][2];
  50.                     if (edges[i][2] > max) {
  51.                         max = edges[i][2];
  52.                     }
  53.                 }
  54.                 continue;
  55.             }
  56.             //predchozi hrana vrcholu A a B != soucasna hrana
  57.             if (vertexes[edges[i][0]][1] != edges[i][2] && vertexes[edges[i][1]][1] != edges[i][2]) {
  58.                 int help = vertexes[edges[i][0]][0];
  59.                 //delka ve vrcholu A < nez B + nova cesta
  60.                 if (help < (vertexes[edges[i][1]][0] + edges[i][2])) {
  61.                     vertexes[edges[i][0]][1] = edges[i][2];
  62.                     vertexes[edges[i][0]][0] = vertexes[edges[i][1]][0] + edges[i][2];
  63.                     if (vertexes[edges[i][0]][0] > max) {
  64.                         max = vertexes[edges[i][0]][0];
  65.                     }
  66.                 }
  67.                 //delka ve vrcholu B < nez A + nova cesta
  68.                 if (vertexes[edges[i][1]][0] < (help + edges[i][2])) {
  69.                     vertexes[edges[i][1]][1] = edges[i][2];
  70.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  71.                     if (vertexes[edges[i][1]][0] > max) {
  72.                         max = vertexes[edges[i][1]][0];
  73.                     }
  74.                 }
  75.                 continue;
  76.             }
  77.             //predchozi hrana vrcholu A == soucasna hrana
  78.             if(vertexes[edges[i][0]][1] == edges[i][2])
  79.             {
  80.                 int help = vertexes[edges[i][1]][0];
  81.                 if(help < edges[i][2])
  82.                 {   vertexes[edges[i][1]][1] = edges[i][2];
  83.                     vertexes[edges[i][1]][0] = edges[i][2];
  84.                     if (vertexes[edges[i][1]][0] > max) {
  85.                         max = vertexes[edges[i][1]][0];
  86.                     }
  87.                 }
  88.                 if(help + edges[i][2] > vertexes[edges[i][0]][0])
  89.                 {   vertexes[edges[i][0]][1] = edges[i][2];
  90.                     vertexes[edges[i][0]][0] = help + edges[i][2];
  91.                     if (vertexes[edges[i][0]][0] > max) {
  92.                         max = vertexes[edges[i][0]][0];
  93.                     }
  94.                 }
  95.                 continue;
  96.             }
  97.              //predchozi hrana vrcholu B == soucasna hrana
  98.             if(vertexes[edges[i][1]][1] == edges[i][2])
  99.             {
  100.                 int help = vertexes[edges[i][0]][0];
  101.                 if(help < edges[i][2])
  102.                 {   vertexes[edges[i][0]][1] = edges[i][2];
  103.                     vertexes[edges[i][0]][0] = edges[i][2];
  104.                     if (vertexes[edges[i][0]][0] > max) {
  105.                         max = vertexes[edges[i][0]][0];
  106.                     }
  107.                 }
  108.                 if(help + edges[i][2] > vertexes[edges[i][1]][0])
  109.                 {   vertexes[edges[i][1]][1] = edges[i][2];
  110.                     vertexes[edges[i][1]][0] = help + edges[i][2];
  111.                     if (vertexes[edges[i][1]][0] > max) {
  112.                         max = vertexes[edges[i][1]][0];
  113.                     }
  114.                 }
  115.             }          
  116.         }
  117.         System.out.println(max);
  118.     }
  119.  
  120.     public static int[][] sortArrayByColumn(int column) {
  121.         int[][] sortedArray = new int[M][3];
  122.         int min = edges[0][column];
  123.         int max = edges[0][column];
  124.         //find min and max values for histogram from current column
  125.         for (int i = 1; i < M; i++) {
  126.             if (edges[i][column] < min) {
  127.                 min = edges[i][column];
  128.             } else if (edges[i][column] > max) {
  129.                 max = edges[i][column];
  130.             }
  131.         }
  132.         //histogram length from min to max
  133.         int[] hist = new int[max - min + 1];
  134.         for (int i = 0; i < M; i++) {
  135.             hist[edges[i][column] - min]++;
  136.         }
  137.         //pole vyskytu
  138.         hist[0]--;
  139.         for (int i = 1; i < hist.length; i++) {
  140.             hist[i] = hist[i] + hist[i - 1];
  141.         }
  142.         //min to max
  143.         for (int i = M - 1; i >= 0; i--) {
  144.             int histIndex = edges[i][column] - min;
  145.             int index = hist[histIndex];
  146.             sortedArray[index][column] = edges[i][column];
  147.             sortedArray[index][1] = edges[i][1];
  148.             sortedArray[index][0] = edges[i][0];
  149.             hist[histIndex]--;
  150.         }
  151.         return sortedArray;
  152.     }
  153.  
  154. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement