#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
#define m_k make_pair
#define int long long
using namespace std;
const int N=2*1e5+100;
int n,v[N],w,a[N],sum[N],father[N],fa[N];
int tot,first[N],nxt[N*2],point[N*2];
int dp[N][2];
struct node
{
	int id,zero,one;
};
bool operator <(node a,node b)
{
	return a.one*b.zero>a.zero*b.one;
}
priority_queue <node> q;
int find(int x)
{
	if (x==fa[x]) return x;
	return fa[x]=find(fa[x]);
}
void add_edge(int x,int y)
{
	tot++;
	nxt[tot]=first[x];
	first[x]=tot;
	point[tot]=y;
}
signed main()
{
	tot=-1;
	memset(first,-1,sizeof(first));
	memset(nxt,-1,sizeof(nxt));
	scanf("%lld",&n);
	for (int i=2;i<=n;i++)
	{
		scanf("%lld",&father[i]);
		add_edge(father[i],i);
	}
	for (int i=1;i<=n;i++) fa[i]=i;
	for (int i=1;i<=n;i++) scanf("%lld",&v[i]);
	for (int i=1;i<=n;i++)
	{
		dp[i][v[i]]++;
		if (i!=1) q.push(node{i,dp[i][0],dp[i][1]});
	}
	int ans=0;
	while (!q.empty())
	{
		node x=q.top();
		q.pop();
		if (x.one!=dp[x.id][1] || x.zero!=dp[x.id][0]) continue;
		int y=find(father[x.id]);
		ans+=dp[y][1]*dp[x.id][0];
		dp[y][0]+=dp[x.id][0],dp[y][1]+=dp[x.id][1];
		if (y!=1) q.push(node{y,dp[y][0],dp[y][1]});
		fa[x.id]=y;
	}
	printf("%lld\n",ans);
}
