zoukankan      html  css  js  c++  java
  • LCA 求 树中两个点的距离

    PS:在树中:dis(u,v)=dis(root,v)+dis(root,u)-2*dis(root,lca(u,v));

        这个性质可以写很多题。

    vector<int>mp[N];
    int dp[N][LN];
    int dep[N];
    void dfs(int u,int fa,int t) //dfs(root)
    {
    dp[u][0]=fa;
    dep[u]=t;
    for (int i=0;i<mp[u].size();i++)
    {
    int v=mp[u][i];
    if (v==fa) continue;
    dfs(v,u,t+1);
    }
    }

    int lca(int u,int v)//lca
    {
    if (dep[u]<dep[v]) swap(u,v);
    int dif=dep[u]-dep[v];
    for (int i=0;i<LN;i++)
    if ((dif>>i)&1) u=dp[u][i];
    if (u==v) return u;
    for (int i=LN-1;i>=0;i--)
    if (dp[u][i]!=dp[v][i]) u=dp[u][i],v=dp[v][i];
    return dp[u][0];
    }

    int main()
    {
    int T;
    scanf("%d",&T);
    while (T--)
    {
    int n,q;
    scanf("%d%d",&n,&q);
    for (int i=0;i<=n;i++) mp[i].clear();
    for (int i=1;i<n;i++)
    {
    int x,y;
    scanf("%d%d",&x,&y);
    mp[x].push_back(y);
    mp[y].push_back(x);
    }

    dfs(1,0,0);
    for (int i=1;i<LN;i++)
    for (int j=1;j<=n;j++)
    dp[j][i]=dp[dp[j][i-1]][i-1];

    //dis(u,root)=dep[u]

  • 相关阅读:
    DBHelper
    ASP.NET WEBAPI oken验证
    市面上的网盘和搜索网盘资源网站
    C#批量删除注释与空行
    DB help
    抽象工厂1
    抽象工厂
    单例模式的八种写法
    Docker概念
    Django的安装
  • 原文地址:https://www.cnblogs.com/forgot93/p/4369810.html
Copyright © 2011-2022 走看看