fork download
  1. import java.util.*;
  2. import java.io.*;
  3.  
  4. public class Main {
  5. static List<Integer>[] tree;
  6. static char[] colors;
  7. static long[] weights;
  8. static long minCost = Long.MAX_VALUE;
  9.  
  10. public static void main(String[] args) throws IOException {
  11. int n = Integer.parseInt(br.readLine());
  12. colors = br.readLine().trim().toCharArray();
  13. weights = new long[n];
  14. StringTokenizer st = new StringTokenizer(br.readLine());
  15. for (int i = 0; i < n; i++) {
  16. weights[i] = Long.parseLong(st.nextToken());
  17. }
  18.  
  19. tree = new ArrayList[n];
  20. for (int i = 0; i < n; i++) tree[i] = new ArrayList<>();
  21. for (int i = 0; i < n - 1; i++) {
  22. st = new StringTokenizer(br.readLine());
  23. int u = Integer.parseInt(st.nextToken()) - 1;
  24. int v = Integer.parseInt(st.nextToken()) - 1;
  25. tree[u].add(v);
  26. tree[v].add(u);
  27. }
  28.  
  29. // 遍历每个节点作为根节点
  30. for (int root = 0; root < n; root++) {
  31. char target = colors[root];
  32. long[] sum = new long[1];
  33. boolean valid = dfs(root, -1, target, sum);
  34. if (valid) {
  35. minCost = Math.min(minCost, sum[0]);
  36. }
  37. }
  38.  
  39. System.out.println(minCost);
  40. }
  41.  
  42. // 返回是否需要修改该子树,并累加代价
  43. static boolean dfs(int node, int parent, char target, long[] sum) {
  44. boolean needModify = (colors[node] != target);
  45. for (int child : tree[node]) {
  46. if (child == parent) continue;
  47. boolean childNeed = dfs(child, node, target, sum);
  48. if (childNeed) {
  49. needModify = true; // 如果子节点需要修改,则当前节点必须被覆盖
  50. }
  51. }
  52. if (needModify) {
  53. sum[0] += weights[node];
  54. }
  55. return needModify;
  56. }
  57. }
Success #stdin #stdout 0.08s 55020KB
stdin
3
RBB
1 2 3
1 2
2 3
stdout
3