#include <bits/stdc++.h>
#define mset(a, b) memset(a, b, sizeof(a))
#define mpcy(a, b) memcpy(a, b, sizeof(a))
using namespace std;
typedef long long LL;
const int MAXN = 200005;

template <typename T> inline void read(T &AKNOI) {
	T x = 0, flag = 1;
	char ch = getchar();
	while (!isdigit(ch)) {
		if (ch == '-') flag = - 1;
		ch = getchar();
	}
	while (isdigit(ch)) {
		x = x * 10 + ch - '0';
		ch = getchar();
	}
	AKNOI = flag * x;
}

int n, fa[MAXN], f[MAXN], vis[MAXN];

struct Node {
	int c0, c1, id;
	bool operator < (const Node &rhs) const {
		return 1LL * c0 * rhs.c1 < 1LL * c1 * rhs.c0;
	}
} p[MAXN];
priority_queue<Node> q;

int getf(int x) {
	return (f[x] == x)? x : f[x] = getf(f[x]);
}

void init() {
	read(n);
	for (int i = 2; i <= n; ++i) {
		read(fa[i]);
	}
	for (int i = 1; i <= n; ++i) {
		int x; read(x);
		(x? p[i].c1 : p[i].c0) = 1;
		p[i].id = f[i] = i;
	}
}

void solve() {
	LL ans = 0;
	for (int i = 2; i <= n; ++i) {
		q.push(p[i]);
	}
	while (!q.empty()) {
		Node cur = q.top();
		q.pop();
		int u = cur.id;
		if (vis[u] || cur.c0 != p[u].c0 || cur.c1 != p[u].c1) continue;
		vis[u] = 1;
		int v = getf(fa[u]);
		ans += 1LL * p[v].c1 * p[u].c0;
		f[u] = v;
		p[v].c0 += p[u].c0;
		p[v].c1 += p[u].c1;
		if (v > 1) q.push(p[v]);
	}
	printf("%lld\n", ans);
}

int main() {
	init();
	solve();
	return 0;	
}
