#include<cstdio>
#include<queue>
#include<algorithm>
#define	LL long long
#define For(i, a, b) for(register int i = a; i <= b; ++i)
using namespace std;
const int maxn = 2e5 + 5;
struct _01 {
	int c0, c1, id;
	bool operator < (const _01 & A) const {
		return 1ll * c0 * A.c1 < 1ll * A.c0 * c1;
	}
};
priority_queue<_01 > q;
int fa[maxn], n, a, u, v, cnt[maxn][2];
LL ans;

namespace DSU {
	int fa[maxn];
	void init(int n) {For(i, 0, n) fa[i] = i;}
	int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
	void combine(int a, int b) {fa[find(a)] = find(b);}
}

int main() {
	scanf("%d", &n), DSU::init(n);
	For(i, 2, n) scanf("%d", &fa[i]);
	For(i, 1, n) {
		scanf("%d", &a), u = a == 0, v = a == 1, cnt[i][a] = 1;
	}
	For(i, 2, n) q.push((_01){cnt[i][0], cnt[i][1], i});
	_01 now;
	while(!q.empty()) {
		now = q.top(), q.pop();
		u = DSU::find(now.id);
		if(cnt[u][0] == now.c0 && cnt[u][1] == now.c1) {
			v = DSU::find(fa[u]);
			ans += 1ll * cnt[v][1] * cnt[u][0];
			cnt[v][1] += cnt[u][1];
			cnt[v][0] += cnt[u][0];
			DSU::combine(u, v);
			if(v != 1) q.push((_01) {cnt[v][0], cnt[v][1], v});
		}
	}
	printf("%lld", ans);
	return 0;
}