Advertisement
Guest User

Untitled

a guest
Jan 19th, 2019
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.39 KB | None | 0 0
  1. import java.io.BufferedReader;
  2. import java.io.IOException;
  3. import java.io.InputStreamReader;
  4. import java.util.ArrayList;
  5. import java.util.Arrays;
  6. public class debug {
  7.  
  8. public static int N, M, log;
  9. public static int lca[][], depth[];
  10. public static long dis[];
  11. public static ArrayList<Integer> adj[], dist[];
  12.  
  13. public static void main(String[] args) throws IOException {
  14. BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  15. String[] input = br.readLine().split(" ");
  16. N = Integer.parseInt(input[0]);
  17. M = Integer.parseInt(input[1]);
  18. log = (int) (Math.log(N) / Math.log(2)) + 1;
  19. depth = new int[N + 1];
  20. lca = new int[log][N + 1];
  21. dis = new long[N + 1];
  22. adj = new ArrayList[N + 1];
  23. dist = new ArrayList[N + 1];
  24. for (int i = 0; i < lca.length; i++)
  25. Arrays.fill(lca[i], -1);
  26. for (int i = 0; i <= N; i++) {
  27. adj[i] = new ArrayList<Integer>();
  28. dist[i] = new ArrayList<Integer>();
  29. }
  30. for (int i = 0; i < M; i++) {
  31. input = br.readLine().split(" ");
  32. int u = Integer.parseInt(input[0]) - 1, v = Integer.parseInt(input[1]) - 1, d = Integer.parseInt(input[2]);
  33. adj[u].add(v);
  34. adj[v].add(u);
  35. dist[u].add(d);
  36. dist[v].add(d);
  37. }
  38. dfs(0, -1);
  39. build();
  40. int Q = Integer.parseInt(br.readLine());
  41. for (int i = 1; i <= Q; i++) {
  42. input = br.readLine().split(" ");
  43. int u = Integer.parseInt(input[0]) - 1, v = Integer.parseInt(input[1]) - 1, rt = query(u, v);
  44. System.out.println(dis[u] + dis[v] - 2 * dis[rt]);
  45. }
  46. }
  47.  
  48. static void dfs(int u, int pa) {
  49. for (int i = 0; i < adj[u].size(); i++) {
  50. int v = adj[u].get(i), w0 = dist[u].get(i);
  51. if (v != pa) {
  52. depth[v] = depth[u] + 1;
  53. dis[v] = dis[u] + w0;
  54. lca[0][v] = u;
  55. dfs(v, u);
  56. }
  57. }
  58. }
  59.  
  60. static int query(int u, int v) {
  61. if (depth[u] < depth[v]) {
  62. int a = u;
  63. u = v;
  64. v = a;
  65. }
  66. for (int i = lca.length - 1; i >= 0; i--) {
  67. if (lca[i][u] != -1 && depth[lca[i][u]] >= depth[v])
  68. u = lca[i][u];
  69. }
  70. if (u == v)
  71. return v;
  72. for (int i = lca.length - 1; i >= 0; i--) {
  73. if (lca[i][u] != -1 && lca[i][v] != -1 && lca[i][u] != lca[i][v]) {
  74. u = lca[i][u];
  75. v = lca[i][v];
  76. }
  77. }
  78. return lca[0][u];
  79. }
  80.  
  81. static void build() {
  82. for (int i = 1; i < lca.length; i++) {
  83. for (int j = 0; j <= N; j++) {
  84. if (lca[i - 1][j] != -1)
  85. lca[i][j] = lca[i - 1][lca[i - 1][j]];
  86. }
  87. }
  88. }
  89. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement