#include <bits/stdc++.h>
using namespace std;

typedef long long lint;
const int maxn = 100005;

int n, f[maxn], fa[maxn], cnt[maxn][2];
lint ans;

struct node
{
	int cnt_0, cnt_1, id;
	
	friend bool operator < (const node &a, const node &b) {
		return (lint)a.cnt_1 * b.cnt_0 > (lint)a.cnt_0 * b.cnt_1;
	}
};
priority_queue<node> q;

inline int gi()
{
	char c = getchar();
	while (c < '0' || c > '9') c = getchar();
	int sum = 0;
	while ('0' <= c && c <= '9') sum = sum * 10 + c - 48, c = getchar();
	return sum;
}

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

int main()
{
	n = gi();
	for (int i = 2; i <= n; ++i) fa[i] = gi();
	for (int i = 1; i <= n; ++i) cnt[i][gi()] = 1;
	for (int i = 1; i <= n; ++i) f[i] = i;
	for (int i = 2; i <= n; ++i) q.push((node) {cnt[i][0], cnt[i][1], i});

	int u, v;
	node tmp;
	while (!q.empty()) {
		tmp = q.top();
		u = find(tmp.id); q.pop();
		if (cnt[u][0] == tmp.cnt_0 && cnt[u][1] == tmp.cnt_1) {
			v = find(fa[u]);
			ans += (lint)cnt[v][1] * cnt[u][0];
			cnt[v][0] += cnt[u][0];
			cnt[v][1] += cnt[u][1];
			f[u] = f[v];
			if (v != 1) q.push((node) {cnt[v][0], cnt[v][1], v});
		}
	}

	printf("%lld\n", ans);
	
	return 0;
}
