操作1和操作2代码如下
void upd(int x,int y,int val){//操作1
val%=mod;
while (top[x]!=top[y]){
if (dep[top[x]]<dep[top[y]])swap(x,y);
update(1,dfn[top[x]],dfn[x],val);
x=fa[top[x]];
}
if (dep[x]>dep[y])swap(x,y);
update(1,dfn[x],dfn[y],val);
}
int que(int x,int y){//操作2
int ans=0;
while (top[x]!=top[y]){
if (dep[top[x]]<dep[top[y]])swap(x,y);
ans+=query(1,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
if (dep[x]>dep[y])swap(x,y);
ans+=query(1,dfn[x],dfn[y]);
return ans%mod;
}
在while语句中,if语句如果写成这样
if (dfn[top[x]]<dfn[top[y]])swap(x,y);
也不会出错,这是为什么呢? (dfn:当前结点的时间戳) (dep:当前结点的深度)