#include<bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
typedef long long ll;
cs int N = 2e5 + 50;
int n, fa[N], ct[N][2];
struct dat{
	int x, y, c; 
	bool operator < (cs dat &a) cs { return (ll)x * a.y < (ll)y * a.x; }
}; priority_queue<dat> q;
int anc[N];
int fnd(int x){ return x==anc[x]?x:anc[x]=fnd(anc[x]); }
int main(){
	#ifdef FSYolanda
	freopen("1.in","r",stdin);
	#endif
	scanf("%d",&n);
	for(int i=1; i<=n; i++) anc[i]=i;
	for(int i=2; i<=n; i++) scanf("%d",&fa[i]);
	for(int i=1,x; i<=n; i++) scanf("%d",&x), ++ct[i][x];
	for(int i=1; i<=n; i++) q.push((dat){ct[i][0],ct[i][1],i});
	ll Ans = 0;
	while(!q.empty()){
		dat x = q.top(); q.pop(); int u = fnd(x.c);
		if(u == 1) continue;
		if(ct[u][0] == x.x && ct[u][1] == x.y){
			int an = fnd(fa[u]); anc[fnd(u)] = an;
			Ans += (ll)ct[u][0] * ct[an][1];
			ct[an][1] += ct[u][1];
			ct[an][0] += ct[u][0]; 
			q.push((dat){ct[an][0],ct[an][1],an});
		}
	} cout << Ans; return 0;
} 