如果你调样例发现自己答案差一,可能是这里出了问题。
我之前错误的写法:
void dfs1(int u,int ff)
{
fa[u]=ff;dep[u]=dep[ff]+1;si[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;chu[v]=e[i].w;
if(v==ff) continue;
dfs1(v,u);si[u]+=si[v];
if(si[heavy[u]]<si[v]) heavy[u]=v;
}
}
调了后正确的写法
void dfs1(int u,int ff)
{
fa[u]=ff;dep[u]=dep[ff]+1;si[u]=1;
for(int i=head[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==ff) continue;
dfs1(v,u);si[u]+=si[v];chu[v]=e[i].w;
if(si[heavy[u]]<si[v]) heavy[u]=v;
}
}
一定要先判是否为父亲节点再处理值的信息!