Cod sursa(job #2064274)

Utilizator alexnekiNechifor Alexandru alexneki Data 12 noiembrie 2017 02:26:04
Problema Algoritmul lui Dijkstra Scor 0
Compilator java Status done
Runda Arhiva educationala Marime 2.33 kb

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
import java.util.TreeSet;

public class Main {

  static int n;
  static int m;

  static List<Integer>[] g;
  static List<Integer>[] cost;
  
  static int[] dist;

  public static void main(String[] args) throws FileNotFoundException, IOException {
    BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("dijkstra.in")));
    BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("dijkstra.out")));

    String[] parts = in.readLine().split(" ");
    n = Integer.parseInt(parts[0]);
    m = Integer.parseInt(parts[1]);

    g = new List[n];
    cost = new List[n];
    dist = new int[n];
    for (int i = 0; i < n; i++) {
      g[i] = new ArrayList<>();
      cost[i] = new ArrayList<>();      
      dist[i] = Integer.MAX_VALUE;
    }

    dist[0] = 0;
    for (int i = 0; i < m; i++) {
      parts = in.readLine().split(" ");
      int from = Integer.parseInt(parts[0]) - 1;
      int to = Integer.parseInt(parts[1]) - 1;
      int cost = Integer.parseInt(parts[2]);
      g[from].add(to);
      g[from].add(cost);
//      out.println(from + ", " + to + ", " + cost);
    }

    PriorityQueue<Integer> pq = new PriorityQueue<>(n, new Comparator<Integer>() {
      @Override
      public int compare(Integer o1, Integer o2) {
        return dist[o1] - dist[o2];
      }
    });
    TreeSet<Long> ts = new TreeSet<>();
    ts.add(0L);
    while (!ts.isEmpty()) {
      int node = ts.pollFirst().intValue();
      for (int i = 0; i < g[node].size(); i++) {
        int newDist = dist[node] + cost[node].get(i);
        if (newDist < dist[g[node].get(i)]) {
          dist[g[node].get(i)] = newDist;
          ts.add(((1L * newDist) << 32) + g[node].get(i));
        }
      }
    }

    for (int i = 1; i < n; i++) {
      if (dist[i] < Integer.MAX_VALUE) {
        out.write(dist[i] + " ");
      } else {
        out.write("0 ");
      }
    }
    out.close();
  }
}