#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
#include<set>
using namespace std;
typedef long long LL;
const LL N=200005;
LL ff[N],v[N];
LL n;
LL cnt0[N],cnt1[N];
struct qq
{
	LL x;
	qq () {}
	qq (LL _x)	{x=_x;}
};
bool operator < (qq x,qq y)	
{
	LL t=cnt1[x.x]*cnt0[y.x],t1=cnt0[x.x]*cnt1[y.x];
	return t==t1?x.x<y.x:t<t1;
}
set<qq> s;
LL fa[N];
LL find_fa (LL x)	{return fa[x]==x?x:fa[x]=find_fa(fa[x]);}
int main()
{
	scanf("%lld",&n);
	for (LL u=2;u<=n;u++) scanf("%lld",&ff[u]);
	for (LL u=1;u<=n;u++)
	{
		LL x;
		scanf("%lld",&x);
		if (x==0) cnt0[u]=1;
		else cnt1[u]=1;
		if (u!=1) 
		{
			//printf("YES:%lld\n",u);
			s.insert(qq(u));
		}
		fa[u]=u;
	}
	//printf("%lld\n",s.size());
	LL ans=0;
	while (!s.empty())
	{
		LL x=(*s.begin()).x;
		LL xx=find_fa(ff[x]);
	//	printf("%lld %lld\n",x,xx);
		ans=ans+cnt1[xx]*cnt0[x];
		s.erase(qq(x));
		if (xx!=1) s.erase(qq(xx));
		cnt1[xx]+=cnt1[x];
		cnt0[xx]+=cnt0[x];
		fa[x]=xx;
		if (xx!=1) s.insert(qq(xx));
	}
	printf("%lld\n",ans);
	return 0;
}