两种方法,一种对边权加差分,一种对点加差分
松鼠的新家
对点加,两两点间求LCA,差分
int e[N],ne[N],h[N],idx;
void add(int a,int b)
{
e[idx] = b , ne[idx] = h[a] , h[a] = idx ++;
}
int f[N][31],dep[N];
int n,a[N],d[N];
void bfs()
{
memset(dep,0x3f,sizeof dep);
dep[0] = 0 ,dep[1] = 1;
queue<int> qu;
qu.push(1);
while(qu.size())
{
int t = qu.front();
qu.pop();
for(int i = h[t] ; ~i; i = ne[i])
{
int j = e[i];
if(dep[j] > dep[t] + 1)
{
dep[j] = dep[t] + 1;
qu.push(j);
f[j][0] = t;
for(int k = 1 ; k <= 30 ; k ++ )
f[j][k] = f[f[j][k-1]][k-1];
}
}
}
}