Guest User

Untitled

a guest
Jul 16th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.29 KB | None | 0 0
  1. package graph;
  2.  
  3. import java.io.*;
  4. import java.util.StringTokenizer;
  5. import java.util.Arrays;
  6. import java.util.PriorityQueue;
  7.  
  8. public class Dijkstra_ElogV implements Runnable {
  9.  
  10. class Pair implements Comparable<Pair>{
  11. int number;
  12. double d;
  13.  
  14.  
  15. public int compareTo(Pair that) {
  16. if(d < that.d) return -1;
  17. if(d > that.d) return 1;
  18. return 0;
  19. }
  20. }
  21.  
  22. class Edge {
  23. int v1;
  24. int v2;
  25. int w;
  26.  
  27. Edge(int v1, int v2, int w) {
  28. this.v1 = v1;
  29. this.v2 = v2;
  30. this.w = w;
  31. }
  32. }
  33.  
  34. int n;
  35. int m;
  36. int[] head;
  37. Edge[] value;
  38. int[] next;
  39. Pair[] d;
  40.  
  41. PriorityQueue<Pair> q = new PriorityQueue<Pair>();
  42.  
  43. void relax(Edge e) {
  44. if(d[e.v1].d + e.w < d[e.v2].d) {
  45.  
  46. q.remove(d[e.v2]);
  47.  
  48. d[e.v2].d = d[e.v1].d + e.w;
  49.  
  50. q.add(d[e.v2]);
  51.  
  52.  
  53. }
  54. }
  55.  
  56. void dijkstra(int v) {
  57.  
  58. d[v].d = 0;
  59.  
  60. for(int i = 1; i <= n; i++) q.add(d[i]);
  61.  
  62. while(!q.isEmpty()) {
  63. Pair u = q.poll();
  64. for(int i = head[u.number]; i != -1; i = next[i]) {
  65. relax(value[i]);
  66. }
  67. }
  68.  
  69. }
  70.  
  71. public void run() {
  72. try {
  73. BufferedReader in = new BufferedReader(new FileReader("input.txt"));
  74. PrintWriter out = new PrintWriter("output.txt");
  75. StringTokenizer st = new StringTokenizer(in.readLine());
  76.  
  77. n = Integer.parseInt(st.nextToken());
  78. m = Integer.parseInt(st.nextToken());
  79.  
  80. head = new int[n + 1];
  81. value = new Edge[m];
  82. next = new int[m];
  83. d = new Pair[n + 1];
  84.  
  85. Arrays.fill(head, -1);
  86.  
  87. for(int i = 1; i <= n; i++) {
  88. d[i] = new Pair();;
  89. d[i].number = i;
  90. d[i].d = Double.POSITIVE_INFINITY;
  91. }
  92.  
  93. int t1;
  94. int t2;
  95.  
  96. for(int i = 0; i < m; i++) {
  97. st = new StringTokenizer(in.readLine());
  98. t1 = Integer.parseInt(st.nextToken());
  99. t2 = Integer.parseInt(st.nextToken());
  100.  
  101. value[i] = new Edge(t1, t2, Integer.parseInt(st.nextToken()));
  102. next[i] = head[t1];
  103. head[t1] = i;
  104. }
  105.  
  106. dijkstra(1);
  107.  
  108. for(int i = 1; i <= n; i++) {
  109. if(d[i].d == Double.POSITIVE_INFINITY) {
  110. out.print("inf ");
  111. continue;
  112. }
  113. out.print((int) d[i].d + " ");
  114. }
  115.  
  116. in.close();
  117. out.close();
  118. } catch(IOException e) {}
  119. }
  120.  
  121. public static void main(String[] args) {
  122. new Thread(new Dijkstra_ElogV()).start();
  123. }
  124. }
Add Comment
Please, Sign In to add comment