@[云浅知处](/user/307453) dfs2没判断是否是父节点
by 啊嘞嘞嘞嘞 @ 2020-09-02 21:34:11
@[云浅知处](/user/307453) 问题太多了。
- dfs2,dfs1没判父亲
- rk数组用错了,该dfn
- 过不了样例
by JK_LOVER @ 2020-09-02 21:44:15
- si[r] 没有更新
by JK_LOVER @ 2020-09-02 21:46:22
@[JK_LOVER](/user/227824)
- 过不了样例我知道啦QAQ
- DFS1DFS2判父节点了qwq
- rk数组改dfn了,这里是改后之后的:
```cpp
LL DFS1(LL u,LL dep){
hson[u]=0;
sz[hson[u]]=0;
d[u]=dep;
sz[u]=1;
for(LL i=0,s=v[u].size();i<s;i++){
if(v[u][i]==fa[u])continue;
sz[u]+=DFS1(v[u][i],dep+1);
fa[v[u][i]]=u;
if(sz[v[u][i]]>sz[hson[u]]){
hson[u]=v[u][i];
}
}
return sz[u];
}
LL tot=0;
void DFS2(LL u,LL tp){
top[u]=tp;
tot++;
dfn[u]=tot;
val[tot]=w[u];
rk[tot]=u;
if(hson[u]!=0){
DFS2(hson[u],tp);
for(LL i=0,s=v[u].size();i<s;i++){
if(v[u][i]!=hson[u]&&v[u][i]!=fa[u]){
DFS2(v[u][i],v[u][i]);
}
}
}
}
```
```cpp
inline void add(LL x,LL y,LL z){
z%=p;
while(top[x]!=top[y]){
if(d[top[x]]<d[top[y]])swap(x,y);
tree.change(dfn[top[x]],dfn[x],z,1,n,1);
x=fa[top[x]];
}
if(d[x]>d[y])swap(x,y);
tree.change(dfn[x],dfn[y],z,1,n,1);
}
inline LL querysum(LL x,LL y){
LL ans=0;
while(top[x]!=top[y]){
if(d[top[x]]<d[top[y]])swap(x,y);
ans+=tree.query(dfn[top[x]],dfn[x],1,n,1);
x=fa[top[x]];
}
if(d[x]>d[y])swap(x,y);
ans+=tree.query(dfn[x],dfn[y],1,n,1);
return ans;
}
inline void addson(LL x,LL z){
z%=p;
tree.change(dfn[x],dfn[x]+sz[x]-1,z,1,n,1);
}
inline LL queryson(LL x){
return tree.query(dfn[x],dfn[x]+sz[x]-1,1,n,1)%p;
}
```
by 云浅知处 @ 2020-09-02 21:49:43
@[JK_LOVER](/user/227824) si[r]是啥啊/fad
by 云浅知处 @ 2020-09-02 21:50:13
@[云浅知处](/user/307453) 根节点的size/kk
by JK_LOVER @ 2020-09-02 22:01:56
@[云浅知处](/user/307453) 建议插入中间输出代码判断具体是哪个函数出错(
如:
```
DFS1(r,1);
printf("dfs1\n");
DFS2(r,r);
printf("dfs2\n");
tree.build(1,n,1);
```
by StarLbright40 @ 2020-09-02 22:03:59
@[星光0000](/user/128570) 这么搞一下,出来之后,貌似是`DFS1`错了?`DFS2`和`build`没问题
by 云浅知处 @ 2020-09-02 22:07:14
@[云浅知处](/user/307453) 啥也没输出就是dfs1炸了嘛(废话
by StarLbright40 @ 2020-09-02 22:09:38
~~把dfs1改成void试试?~~
by StarLbright40 @ 2020-09-02 22:13:26