#include<iostream>
#include<iomanip>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<queue>
#include<algorithm>
#include<set>
using namespace std;
int n,prt[300005],w[300005],fa[300005],sizes[300005],sums[300005];
long long ans=0;
int read()
{
	char c=getchar();
	int res=0;
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9') res=(res<<1)+(res<<3)+(c^48),c=getchar();
	return res;
}
int find(int x)
{
	return (x==fa[x])?x:fa[x]=find(fa[x]);
}
struct que
{
	int id;
	long long v,num;
	friend bool operator <(const que &a,const que &b)
	{
		if(a.v*b.num==b.v*a.num) return a.id<b.id;
		return a.v*b.num>b.v*a.num;
	}
};
set<que> s;
set<que>::iterator it;
int main()
{
	n=read();
	for(int i=2;i<=n;i++) prt[i]=read();
	for(int i=1;i<=n;i++) w[i]=read();
	for(int i=1;i<=n;i++) fa[i]=i;
	for(int i=2;i<=n;i++)
	{
		if(!w[i])
		{
			fa[i]=find(prt[i]),sizes[fa[i]]++;
			if(fa[i]==1&&!w[1]) continue;
			ans++;
		}
	}
	for(int i=1;i<=n;i++) if(w[i]) sums[i]=1;
	for(int i=2;i<=n;i++) if(w[i]) s.insert((que){i,sizes[i],sums[i]});
	int sz=s.size();
	while(sz)
	{
		it=s.begin();s.erase(it);
		int u=(*it).id;
		int fas=find(prt[u]);
		ans+=1ll*sums[fas]*sizes[u];
		if(fas!=1)
		{
			que y=(que){fas,sizes[fas],sums[fas]};s.erase(y);
			sums[fas]+=sums[u];sizes[fas]+=sizes[u];fa[u]=fas;
			y=(que){fas,sizes[fas],sums[fas]};s.insert(y);
		}
		else sums[fas]+=sums[u],sizes[fas]+=sizes[u],fa[u]=fas;
		sz--;
	}
	printf("%lld\n",ans);
}