69 lines
961 B
C++
69 lines
961 B
C++
|
#include<cstdio>
|
||
|
#include<vector>
|
||
|
using namespace std;
|
||
|
const int N=2e5+5,inf=0x3f3f3f3f;
|
||
|
int w[N],to[N],ne[N],h[N];
|
||
|
int cnt=0;
|
||
|
int n;
|
||
|
struct Node
|
||
|
{
|
||
|
int fa;
|
||
|
int sum;
|
||
|
int max;
|
||
|
int min;
|
||
|
int len;
|
||
|
// vector<int> son;
|
||
|
} a[N];
|
||
|
void add(int u,int v,int w1)
|
||
|
{
|
||
|
a[v].fa=u;
|
||
|
w[++cnt]=w1;
|
||
|
to[cnt]=v;
|
||
|
ne[cnt]=h[u];
|
||
|
h[u]=cnt;
|
||
|
}
|
||
|
void dfs(int u)
|
||
|
{
|
||
|
int v,vmax;
|
||
|
a[u].max=0;
|
||
|
a[u].min=inf;
|
||
|
a[u].len=0;
|
||
|
for(int i=h[u]; i; i=ne[i])
|
||
|
{
|
||
|
v=to[i];
|
||
|
dfs(v);
|
||
|
a[u].sum+=a[v].sum+w[i]*(a[v].len+1);
|
||
|
vmax=a[v].max+w[i];
|
||
|
a[u].max=a[u].max>vmax? a[u].max:vmax;
|
||
|
a[u].min=a[u].min<w[i]? a[u].min:w[i];
|
||
|
a[u].len+=a[v].len+1;
|
||
|
}
|
||
|
if(a[u].min==inf)
|
||
|
{
|
||
|
a[u].min=0;
|
||
|
}
|
||
|
// if(a[u].len==0)
|
||
|
// {
|
||
|
// a[u].len=1;
|
||
|
// }
|
||
|
}
|
||
|
void ce()
|
||
|
{
|
||
|
for(int i=1; i<=n; i++)
|
||
|
{
|
||
|
printf("%d:%d %d %d %d %d\n",i,a[i].fa ,a[i].max,a[i].min,a[i].sum,a[i].len );
|
||
|
}
|
||
|
}
|
||
|
int main()
|
||
|
{
|
||
|
int u,v,w1;
|
||
|
scanf("%d",&n);
|
||
|
for(int i=2; i<=n; i++)
|
||
|
{
|
||
|
scanf("%d%d",&u,&w1);
|
||
|
add(u,i,w1);
|
||
|
}
|
||
|
dfs(1);
|
||
|
ce();
|
||
|
}
|