算法笔记

模板:

vector<int>g[N];
vector<int>edge[N];
int anc[20][N];
int deep[N];
int h[N];
void dfs(int o,int u,int w)
{
    if(u!=o)deep[u]=deep[o]+1,h[u]=h[o]+w;
    for(int j=0;j<g[u].size();j++)
    {
        if(g[u][j]!=o)
        {
            anc[0][g[u][j]]=u;
            for(int i=1;i<20;i++)anc[i][g[u][j]]=anc[i-1][anc[i-1][g[u][j]]];
            dfs(u,g[u][j],edge[u][j]);
        }
    }
}
int lca(int u,int v)
{
    if(deep[u]<deep[v])swap(u,v);
    for(int i=19;i>=0;i--)if(deep[anc[i][u]]>=deep[v])u=anc[i][u];
    if(u==v)return u;
    for(int i=19;i>=0;i--)if(anc[i][u]!=anc[i][v])u=anc[i][u],v=anc[i][v];
    return anc[0][u];
} 
int dis(int u,int v)
{
    int l=lca(u,v);
    return h[u]+h[v]-2*h[l];
}
View Code

相关文章:

  • 2022-02-07
  • 2021-12-11
  • 2022-12-23
  • 2021-10-25
  • 2021-05-25
猜你喜欢
  • 2018-03-16
  • 2022-12-23
  • 2022-12-23
  • 2022-01-28
  • 2022-12-23
  • 2022-12-23
  • 2021-08-10
相关资源
相似解决方案