倍增求LCA时避免父亲倍增数组出现0,倍增记录最小值时,简单写法
int now=0; for (int i=1;i<=n;i++) { if (vi[i]!=0) continue; now++; dfs(i,0,0,inf,now); f[i][0]=i;//使当前的father==i chmin[i][0]=inf;//记录的最小值 }
求deep时,注意不是求距离上的deep,而是层数
void dfs(int x,int father,int deep,int last,int visit) { de[x]=deep; vi[x]=visit; f[x][0]=father; chmin[x][0]=last; for (int i=first[x];i!=-1;i=nxt[i]) { if (point[i]!=father) { dfs(point[i],x,deep+1,len[i],visit);//deep是+1,不是加len[i],注意 } } }