1 条题解

  • 0
    @ 2025-7-3 19:16:33

    JAVA题解:

    import java.io.*;
    import java.util.*;
    
    public class Main {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String[] line = br.readLine().trim().split(" ");
            int N = Integer.parseInt(line[0]);
            int M = Integer.parseInt(line[1]);
            
            // 构建邻接表
            List<Pair>[] adj = new ArrayList[N + 1];
            for (int i = 1; i <= N; i++) {
                adj[i] = new ArrayList<>();
            }
            
            for (int i = 0; i < N - 1; i++) {
                line = br.readLine().trim().split(" ");
                int u = Integer.parseInt(line[0]);
                int v = Integer.parseInt(line[1]);
                int c = Integer.parseInt(line[2]);
                adj[u].add(new Pair(v, c));
                adj[v].add(new Pair(u, c));
            }
            
            // BFS 建立父节点与拓扑序
            int[] fa = new int[N + 1];
            List<Integer> order = new ArrayList<>();
            Queue<Integer> q = new LinkedList<>();
            boolean[] visited = new boolean[N + 1];
            
            q.offer(1);
            visited[1] = true;
            
            while (!q.isEmpty()) {
                int u = q.poll();
                order.add(u);
                for (Pair p : adj[u]) {
                    int v = p.node;
                    if (!visited[v]) {
                        visited[v] = true;
                        fa[v] = u;
                        q.offer(v);
                    }
                }
            }
            
            // 子树计数
            int[] cntS = new int[N + 1];
            int[] cntT = new int[N + 1];
            
            for (int i = 0; i < M; i++) {
                line = br.readLine().trim().split(" ");
                int s = Integer.parseInt(line[0]);
                int t = Integer.parseInt(line[1]);
                cntS[s]++;
                cntT[t]++;
            }
            
            // 后序汇总
            for (int i = order.size() - 1; i > 0; i--) {
                int u = order.get(i);
                if (u != 1) { // 跳过根节点
                    cntS[fa[u]] += cntS[u];
                    cntT[fa[u]] += cntT[u];
                }
            }
            
            long sumS = 0, sumT = 0;
            // 累加各边权
            for (int u = 2; u <= N; u++) {
                int p = fa[u];
                // 找到边权
                for (Pair pair : adj[u]) {
                    if (pair.node == p) {
                        if (cntS[u] > 0) {
                            sumS += pair.weight;
                        }
                        if (cntT[u] > 0) {
                            sumT += pair.weight;
                        }
                        break;
                    }
                }
            }
            
            long ans = 2 * (sumS + sumT);
            System.out.println(ans);
        }
        
        static class Pair {
            int node;
            int weight;
            
            public Pair(int node, int weight) {
                this.node = node;
                this.weight = weight;
            }
        }
    }
    
    
    • 1

    信息

    ID
    21
    时间
    1000ms
    内存
    256MiB
    难度
    6
    标签
    递交数
    2
    已通过
    1
    上传者