#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1;
  char ch = getchar();
  while (!isdigit(ch)) {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (isdigit(ch)) {
    x = (x << 1) + (x << 3) + ch - '0';
    ch = getchar();
  }
  return x * f;
}
struct edge {
  int to, nxt;
} g[1100101];
int tot, dep[1010101], head[1010101], a[1010101], fa[1010101];
inline void made(int from, int to) {
  g[++tot].to = to;
  g[tot].nxt = head[from];
  head[from] = tot;
}
void dfs(int u) {
  dep[u] = dep[fa[u]] + 1;
  for (int i = head[u]; i; i = g[i].nxt) {
    int v = g[i].to;
    if (v == fa[u]) continue;
    dfs(v);
  }
}
struct dataa {
  long double x;
  int sz, f, X;
} F[1010101];
int find(int u) {
  if (F[u].f != u) return F[u].f = find(F[u].f);
  return F[u].f;
}
inline bool operator<(dataa a, dataa b) {
  return (fabs(a.x - b.x) < 1e-23
              ? (dep[a.f] == dep[b.f] ? a.f < b.f : dep[a.f] > dep[b.f])
              : a.x < b.x);
}
set<dataa> S;
long long ans;
int main() {
  int n = read();
  for (int i = 2; i <= n; i++) {
    fa[i] = read();
    made(fa[i], i);
    made(i, fa[i]);
  }
  dfs(1);
  for (int i = 1; i <= n; i++) {
    a[i] = read();
    F[i].f = i, F[i].sz = 1;
    F[i].x = a[i];
    F[i].X = a[i];
    if (i != 1) S.insert(F[i]);
  }
  dataa now;
  bool flag = 1;
  while (S.size()) {
    now = (*S.begin());
    S.erase(now);
    int FA = find(fa[now.f]);
    ans += 1ll * F[FA].X * (F[now.f].sz - F[now.f].X);
    if (S.find(F[FA]) != S.end()) S.erase(F[FA]);
    F[FA].sz += F[now.f].sz;
    F[FA].X += F[now.f].X;
    F[FA].x = (long double)F[FA].X / (long double)F[FA].sz;
    F[now.f].f = FA;
    if (FA != 1) S.insert(F[FA]);
  }
  cout << ans;
  return 0;
}
