#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <set>

using namespace std;

typedef long long ll;
const ll maxn = 200010;
struct node
{
    ll num0,num1,id;
    bool operator < (const node &b) const
    {
        if (num1 * b.num0 == num0 * b.num1)
            return id < b.id;
        return num1 * b.num0 < num0 * b.num1;
    }
}e[maxn];

set <node> S;

ll n,fa[maxn],f[maxn],ans;

ll find(ll x)
{
    if (x == f[x])
        return x;
    return f[x] = find(f[x]);
}

int main()
{
    scanf("%lld",&n);
    for (ll i = 2; i <= n; i++)
    {
        scanf("%lld",&fa[i]);
        f[i] = i;
    }
    f[1] = 1;
    for (ll i = 1; i <= n; i++)
    {
        scanf("%lld",&e[i].num1);
        e[i].num0 = 1 - e[i].num1;
        e[i].id = i;
        if (i != 1)
            S.insert(e[i]);
    }
    while (!S.empty())
    {
        node u = *S.begin();
        S.erase(S.begin());
        ll x = u.id;
        ll y = find(fa[x]);
        ans += e[y].num1 * e[x].num0;
        if (y != 1)
            S.erase(e[y]);
        f[find(u.id)] = y;
        e[y].num1 += e[x].num1;
        e[y].num0 += e[x].num0;
        if (y != 1)
            S.insert(e[y]);
    }
    printf("%lld\n",ans);

    return 0;
}
