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

const int maxn = 2e5 + 7;

int val[maxn], anc[maxn];

struct Point {
	long long ones, zeros;
	int inx;
} ;

bool operator < (const Point &a, const Point &b) {
	return a.ones * b.zeros > b.ones * a.zeros; 
}

Point &operator += (Point &a, const Point &b) {
	a.zeros += b.zeros;
	a.ones += b.ones;
	return a;
}

int p[maxn];
Point D[maxn];
vector<int> e[maxn];
int find(int x) {
	if (p[x] == x) return x;
	return p[x] = find(p[x]);
}

int main() {
	int n;
	scanf("%d", &n);
	for (int i = 2; i <= n; i++) {
		scanf("%d", &anc[i]);
		e[ anc[i] ].push_back(i);
	}
	for (int i = 1; i <= n; i++) p[i] = i;

	priority_queue<Point> pq;
	for (int i = 1; i <= n; i++) {
		scanf("%d", &val[i]);
		if (val[i]) D[i] = Point{1LL, 0LL, i};
		else D[i] = Point{0LL, 1LL, i};
		if (i != 1) pq.push(D[i]);
	}

	long long ans = 0;
	while (!pq.empty()) {
		Point tmp = pq.top(); pq.pop();
		if (p[tmp.inx] != tmp.inx) continue;

		int u = tmp.inx, v = find(anc[u]);

		// cout << u << ' ' << v << endl;

		ans += (long long)D[v].ones * D[u].zeros;

		p[u] = v;
		D[v] += D[u];
		// cout << D[v].inx << endl;
		// system("pause");
		if (v != 1) pq.push(D[v]);
	}
	cout << ans << endl;
	return 0;
}
