#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<set>
#define N 1000005
using namespace std;
typedef long long LL;
inline int read()
{
	char c=getchar(); int num=0,f=1;
	while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }
	while (c<='9'&&c>='0') { num=num*10+c-'0'; c=getchar(); }
	return num*f;
}
inline LL readl()
{
	char c=getchar(); LL num=0,f=1;
	while (c<'0'||c>'9') { if (c=='-') f=-1; c=getchar(); }
	while (c<='9'&&c>='0') { num=num*10+c-'0'; c=getchar(); }
	return num*f;
}
int n,cnt=0,a[N],b[N],w[N],fa[N];
struct data{
	LL w; int s,x;
	data(LL _w=0,int _s=0,int _x=0) { w=_w; s=_s; x=_x; }
	bool operator < (const data o) const { return w*o.s<o.w*s||w*o.s==o.w*s&&x<o.x; }
}p[N];
LL ans;
set<data> Q;
int find(int x) { return b[x]==x?x:b[x]=find(b[x]); }
int main()
{
	cnt=n=read(); for (int i=2;i<=n;i++) fa[i]=read();
	for (int i=1;i<=n;i++)
	{
		w[i]=readl(); b[i]=i;
		p[i]=data(w[i],1,i);
		Q.insert(p[i]);
	}
	while (!Q.empty())
	{
		data t=*Q.begin(),e=t; Q.erase(t);
		int y=find(fa[t.x]); if (y==0) continue;
		ans+=(t.s-t.w)*p[y].w;
		Q.erase(p[y]);
		e.w+=p[y].w; e.s+=p[y].s; e.x=++cnt;
		b[cnt]=cnt; b[y]=cnt; b[find(t.x)]=cnt;
		fa[cnt]=fa[y]; fa[t.x]=cnt; 
		p[cnt]=e; Q.insert(e);
	}
	printf("%lld",ans);
	return 0;
}
