qwerty787788

TCO 2018 Final 250

Nov 18th, 2018
306
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 1.16 KB | None | 0 0
  1. import java.util.*;
  2.  
  3. public class BalancingTrees {
  4.  
  5.     public double minCost(int[] p, int[] w) {
  6.         int n = w.length;
  7.         List<Integer>[] g = new List[n];
  8.         for (int i = 0; i < n; i++) {
  9.             g[i] = new ArrayList<>();
  10.         }
  11.         for (int i = 0; i < p.length; i++) {
  12.             g[p[i]].add(i + 1);
  13.         }
  14.         double res = Double.MAX_VALUE;
  15.         for (int notChanged = 0; notChanged < n; notChanged++) {
  16.             if (g[notChanged].size() != 0) {
  17.                 continue;
  18.             }
  19.             double[] sum = new double[n];
  20.             sum[notChanged] = w[notChanged];
  21.             for (int v = notChanged; v != 0; v = p[v - 1]) {
  22.                 sum[p[v - 1]] = w[p[v - 1]] + g[p[v - 1]].size() * sum[v];
  23.             }
  24.             double cur = 0;
  25.             for (int v = 0; v < n; v++) {
  26.                 for (int to : g[v]) {
  27.                     sum[to] = (sum[v] - w[v]) / g[v].size();
  28.                 }
  29.                 if (g[v].isEmpty()) {
  30.                     cur += Math.abs(w[v] - sum[v]);
  31.                 }
  32.             }
  33.             res = Math.min(res, cur);
  34.         }
  35.         return res;
  36.     }
  37. }
Advertisement
Add Comment
Please, Sign In to add comment