Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package graph;
- import java.io.*;
- import java.util.StringTokenizer;
- import java.util.Arrays;
- import java.util.PriorityQueue;
- public class Dijkstra_ElogV implements Runnable {
- class Pair implements Comparable<Pair>{
- int number;
- double d;
- public int compareTo(Pair that) {
- if(d < that.d) return -1;
- if(d > that.d) return 1;
- return 0;
- }
- }
- int n;
- int m;
- int[] head;
- int[] value;
- int[] next;
- Pair[] d;
- int[] parent;
- int[][] w;
- PriorityQueue<Pair> q = new PriorityQueue<Pair>();
- void relax(int u, int v) {
- if(d[u].d + w[u][v] < d[v].d) {
- q.remove(d[v]);
- d[v].d = d[u].d + w[u][v];
- q.add(d[v]);
- parent[v] = u;
- }
- }
- void dijkstra(int v) {
- parent[v] = v;
- d[v].d = 0;
- for(int i = 1; i <= n; i++) q.add(d[i]);
- while(!q.isEmpty()) {
- Pair u = q.poll();
- for(int i = head[u.number]; i != -1; i = next[i]) {
- relax(u.number, value[i]);
- }
- }
- }
- public void run() {
- try {
- BufferedReader in = new BufferedReader(new FileReader("input.txt"));
- PrintWriter out = new PrintWriter("output.txt");
- StringTokenizer st = new StringTokenizer(in.readLine());
- n = Integer.parseInt(st.nextToken());
- m = Integer.parseInt(st.nextToken());
- head = new int[n + 1];
- value = new int[2 * m];
- next = new int[2 * m];
- d = new Pair[n + 1];
- parent = new int[n + 1];
- w = new int[n + 1][n + 1];
- Arrays.fill(head, -1);
- for(int i = 1; i <= n; i++) {
- d[i] = new Pair();;
- d[i].number = i;
- d[i].d = Double.POSITIVE_INFINITY;
- }
- int j = 0;
- int t1;
- int t2;
- for(int i = 0; i < m; i++) {
- st = new StringTokenizer(in.readLine());
- t1 = Integer.parseInt(st.nextToken());
- t2 = Integer.parseInt(st.nextToken());
- value[j] = t2;
- next[j] = head[t1];
- head[t1] = j++;
- value[j] = t1;
- next[j] = head[t2];
- head[t2] = j++;
- w[t1][t2] = w[t2][t1] = Integer.parseInt(st.nextToken());
- }
- dijkstra(1);
- for(int i = 1; i <= n; i++) {
- if(d[i].d == Double.POSITIVE_INFINITY) {
- out.print("inf ");
- continue;
- }
- out.print((int) d[i].d + " ");
- }
- in.close();
- out.close();
- } catch(IOException e) {}
- }
- public static void main(String[] args) {
- new Thread(new Dijkstra_ElogV()).start();
- }
- }
Add Comment
Please, Sign In to add comment