Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import java.io.BufferedReader;
- import java.io.IOException;
- import java.io.InputStreamReader;
- import java.util.ArrayList;
- import java.util.Arrays;
- public class debug {
- public static int N, M, log;
- public static int lca[][], depth[];
- public static long dis[];
- public static ArrayList<Integer> adj[], dist[];
- public static void main(String[] args) throws IOException {
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- String[] input = br.readLine().split(" ");
- N = Integer.parseInt(input[0]);
- M = Integer.parseInt(input[1]);
- log = (int) (Math.log(N) / Math.log(2)) + 1;
- depth = new int[N + 1];
- lca = new int[log][N + 1];
- dis = new long[N + 1];
- adj = new ArrayList[N + 1];
- dist = new ArrayList[N + 1];
- for (int i = 0; i < lca.length; i++)
- Arrays.fill(lca[i], -1);
- for (int i = 0; i <= N; i++) {
- adj[i] = new ArrayList<Integer>();
- dist[i] = new ArrayList<Integer>();
- }
- for (int i = 0; i < M; i++) {
- input = br.readLine().split(" ");
- int u = Integer.parseInt(input[0]) - 1, v = Integer.parseInt(input[1]) - 1, d = Integer.parseInt(input[2]);
- adj[u].add(v);
- adj[v].add(u);
- dist[u].add(d);
- dist[v].add(d);
- }
- dfs(0, -1);
- build();
- int Q = Integer.parseInt(br.readLine());
- for (int i = 1; i <= Q; i++) {
- input = br.readLine().split(" ");
- int u = Integer.parseInt(input[0]) - 1, v = Integer.parseInt(input[1]) - 1, rt = query(u, v);
- System.out.println(dis[u] + dis[v] - 2 * dis[rt]);
- }
- }
- static void dfs(int u, int pa) {
- for (int i = 0; i < adj[u].size(); i++) {
- int v = adj[u].get(i), w0 = dist[u].get(i);
- if (v != pa) {
- depth[v] = depth[u] + 1;
- dis[v] = dis[u] + w0;
- lca[0][v] = u;
- dfs(v, u);
- }
- }
- }
- static int query(int u, int v) {
- if (depth[u] < depth[v]) {
- int a = u;
- u = v;
- v = a;
- }
- for (int i = lca.length - 1; i >= 0; i--) {
- if (lca[i][u] != -1 && depth[lca[i][u]] >= depth[v])
- u = lca[i][u];
- }
- if (u == v)
- return v;
- for (int i = lca.length - 1; i >= 0; i--) {
- if (lca[i][u] != -1 && lca[i][v] != -1 && lca[i][u] != lca[i][v]) {
- u = lca[i][u];
- v = lca[i][v];
- }
- }
- return lca[0][u];
- }
- static void build() {
- for (int i = 1; i < lca.length; i++) {
- for (int j = 0; j <= N; j++) {
- if (lca[i - 1][j] != -1)
- lca[i][j] = lca[i - 1][lca[i - 1][j]];
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement