1 条题解
-
0
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
- 上传者