#include<bits/stdc++.h>
using namespace std;
const int N = 4e5+5;
typedef long long ll;
int n;
int fa[N];
struct Dat{
	int sz0,sz1,id;
	Dat(int sz0=0, int sz1=0, int id=0):sz0(sz0),sz1(sz1),id(id){}
	bool operator < (const Dat b)const{
		return 1ll*sz0*b.sz1 == 1ll*b.sz0*sz1 ?  id > b.id : 1ll*sz0*b.sz1 > 1ll*b.sz0*sz1;
	}
}t[N];
int par[N];
inline int find(int x){
	return par[x]==x?par[x]:par[x] = find(par[x]);
}
ll ans;
set<Dat> S;
inline void combine(int x){
	int cur = find(x), f = find(fa[cur]);
	// cout << cur << ":" << f << endl;
	// cout << t[cur].sz0 << " " << t[cur].sz1 << endl;
	if(f!=1)S.erase(t[f]);
	S.erase(t[cur]);
	par[cur] = f;
	ans += 1ll*t[f].sz1 * t[cur].sz0;
	// cout << ":contribute" << 1ll*t[f].sz1 * t[cur].sz0 << endl;
	t[f].sz1 += t[cur].sz1, t[f].sz0 += t[cur].sz0;
	if(f!=1)S.insert(t[f]);
}

int main()
{
	cin >> n;
	for(int i=2;i<=n;i++){
		scanf("%d",&fa[i]);
	}
	for(int i=1;i<=n;i++){
		par[i] = i;
		int x;scanf("%d",&x);
		if(x)t[i].sz1++;
		else t[i].sz0++;
		t[i].id=i;
		if(i>1){
			// cout << i << " " << "ins" << endl;
			S.insert(t[i]);
			// cout << S.size() << endl;
		}
	}
	for(int j=1;j<n;j++){
		// cout << "sz" << ":" << S.size() << endl;
		combine((*S.begin()).id);
	}
	cout << ans << endl;
}