#include <bits/stdc++.h>

using namespace std;
typedef long double ld;
typedef long long ll;
typedef unsigned long long ull;

const int N = 200005;
int p[N];

int find(int u) {
    return u == p[u] ? u : (p[u] = find(p[u]));
}

int zero[N], one[N], pp[N];

struct Comp {
    bool operator()(int i, int j) {
        return (ll)zero[i] * one[j] > (ll)one[i] * zero[j]
            || ((ll)zero[i] * one[j] == (ll)one[i] * zero[j] && i > j);
    }
};

set<int, Comp> s;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.setf(cout.fixed);
    cout.precision(20);
    int n;
    cin >> n;
    for (int i = 2; i <= n; i++) {
        cin >> pp[i];
    }
    for (int i = 1; i <= n; i++) {
        int v;
        cin >> v;
        zero[i] = v == 0;
        one[i] = v == 1;
        p[i] = i;
        if (i != 1) {
            s.insert(i);
        }
    }
    ll res = 0;
    while (!s.empty()) {
        int i = *s.begin();
        s.erase(s.begin());
        int j = find(pp[i]);
        s.erase(j);
        res += (ll)one[j] * zero[i];
        zero[j] += zero[i];
        one[j] += one[i];
        if (j != 1) {
            s.insert(j);
        }
        p[i] = j;
    }
    cout << res << "\n";
}
