Advertisement
Guest User

Untitled

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