Advertisement
Guest User

Dining Solution

a guest
Dec 18th, 2018
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.88 KB | None | 0 0
  1. import java.util.*;
  2. import java.io.*;
  3. public class dining {
  4.  
  5. public static void main(String[] args) throws IOException{
  6. BufferedReader f = new BufferedReader(new FileReader("dining.in"));
  7. PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("dining.out")));
  8. StringTokenizer st = new StringTokenizer(f.readLine());
  9. int n = Integer.parseInt(st.nextToken());
  10. int m = Integer.parseInt(st.nextToken());
  11. int k = Integer.parseInt(st.nextToken());
  12. Node[] nodes = new Node[n+1];
  13. boolean[][] visited = new boolean[n+1][2];
  14. int[][] paths = new int[n+1][2];
  15. for(int i = 1; i <= n; i++) {
  16. nodes[i] = new Node(i);
  17. paths[i][0] = Integer.MAX_VALUE;
  18. paths[i][1] = Integer.MAX_VALUE;
  19.  
  20. }
  21.  
  22. for(int i = 0; i < m; i++) {
  23. st = new StringTokenizer(f.readLine());
  24. int a = Integer.parseInt(st.nextToken());
  25. int b = Integer.parseInt(st.nextToken());
  26. int t = Integer.parseInt(st.nextToken());
  27. nodes[a].edges.add(new Edge(t, nodes[b]));
  28. nodes[b].edges.add(new Edge(t, nodes[a]));
  29. }
  30.  
  31. for(int i = 0; i < k; i++) {
  32. st = new StringTokenizer(f.readLine());
  33. int a = Integer.parseInt(st.nextToken());
  34. int b = Integer.parseInt(st.nextToken());
  35. nodes[a].haybales.add(b);
  36. }
  37.  
  38. PriorityQueue<State> pq = new PriorityQueue<State>();
  39. paths[n][0] = 0;
  40. pq.add(new State(nodes[n], 0, 0));
  41. while(!pq.isEmpty()) {
  42. State state = pq.poll();
  43. int hay = state.hay > 0 ? 1 : 0;
  44. if(visited[state.node.id][hay]) continue;
  45. visited[state.node.id][hay] = true;
  46. for(Edge e: state.node.edges) {
  47. int newDist = e.weight+state.time;
  48. if(newDist < paths[e.dest.id][hay]) {
  49. paths[e.dest.id][hay] = newDist;
  50. pq.add(new State(e.dest, state.hay, newDist));
  51. }
  52. }
  53. if(hay == 0 && state.node.haybales.size() > 0) {
  54. int newHay = state.node.haybales.last();
  55. paths[state.node.id][1] = state.time-newHay;
  56. for(Edge e: state.node.edges) {
  57. int newDist = e.weight+state.time-newHay;
  58. if(newDist < paths[e.dest.id][1]) {
  59. paths[e.dest.id][1] = newDist;
  60. pq.add(new State(e.dest, newHay, newDist));
  61. }
  62. }
  63. }
  64. }
  65.  
  66. for(int i = 1; i < n; i++) {
  67. if(paths[i][1] <= paths[i][0]) {
  68. out.println("1");
  69. }else {
  70. out.println("0");
  71. }
  72. }
  73. out.close();
  74.  
  75.  
  76. }
  77.  
  78. }
  79.  
  80. class Node{
  81.  
  82. public int id;
  83. public LinkedList<Edge> edges;
  84. public TreeSet<Integer> haybales;
  85.  
  86. public Node(int i) {
  87. id = i;
  88. edges = new LinkedList();
  89. haybales = new TreeSet<Integer>();
  90. }
  91. }
  92.  
  93. class Edge{
  94. public int weight;
  95. public Node dest;
  96.  
  97. public Edge(int w, Node d) {
  98. weight = w;
  99. dest = d;
  100. }
  101. }
  102.  
  103. class State implements Comparable<State>{
  104.  
  105. public Node node;
  106. public int time;
  107. public int hay;
  108.  
  109. public State(Node n, int h, int t) {
  110. node = n;
  111. hay = h;
  112. time = t;
  113. }
  114.  
  115. public int compareTo(State s) {
  116. return time - s.time;
  117. }
  118.  
  119. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement