#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 200000 + 10;
//const int maxn = 100 + 10;

int n, pre[maxn], a[maxn];
ll f0[maxn], f1[maxn];
struct qnode{
	int u;
	ll x, y;
	qnode() {}
	qnode(int _u, ll _x, ll _y):u(_u), x(_x), y(_y) {}

	friend bool operator < (qnode a, qnode b) {
		if((ll)a.x * b.y != (ll)a.y * b.x) return 1LL * a.x * b.y < 1LL * a.y * b.x;
		return a.u < b.u;
	}
};
priority_queue<qnode> q;

ll Ans;
int sfa[maxn], used[maxn];

int findfa(int u) { return (sfa[u] == u) ? (u) : (sfa[u] = findfa(sfa[u])); }

int main() {
//	freopen("data.in","r",stdin);
	scanf("%d", &n);
	for(int i = 2;i <= n;i ++) scanf("%d", &pre[i]);
	for(int i = 1;i <= n;i ++) scanf("%d", &a[i]);
	for(int i = 1;i <= n;i ++) {
    f0[i] = f1[i] = 0;
		if(a[i] == 0) f0[i] ++;
		if(a[i] == 1) f1[i] ++;
		if(i != 1) q.push(qnode(i,f0[i],f1[i]));
		sfa[i] = i; used[i] = 0;
	}
	Ans = 0;
	while(!q.empty()) {
		qnode now = q.top(); q.pop();
		int u = now.u, x = now.x, y = now.y;
		if(f0[u] != x || f1[u] != y || used[u] || sfa[u] != u) continue;
		int p = pre[u]; p = findfa(p);
    Ans += (ll) f1[p] * f0[u];
    f0[p] += f0[u]; f1[p] += f1[u];
		if(p != 1) q.push(qnode(p,f0[p],f1[p]));
		sfa[u] = p; used[u] = 1;
	}
	printf("%lld\n", Ans);
	return 0;
}
