LeiYANG0.0 2023-04-12 19:39 采纳率: 33.3%
浏览 33

有巨佬能看看这个lca求最小距离哪里错了吗


#include<bits/stdc++.h>
//#define int unsigned long long
#define long long int 
//const int mod=1000000007;
const int mn=100005;
using namespace std;
int anc[mn],n,m,ans,dep[mn];
bool vis[mn];
vector<int> q[mn],a[mn];

int dfs(int u,int fa,int d){
 dep[u]=d;
 for(int i=0;i<a[u].size();i++){
     int v=a[u][i];
     if(v==fa) continue;
     dfs(v,u,d+1);
 }    
 return 0;
}

int find(int x){
    
    if(x==anc[x]) return x;
    anc[x]=find(anc[x]);
    
    return anc[x];
    
}

void lca(int u,int fa){
    for(int i=0;i<a[u].size();i++){
    if(a[u][i]==fa) continue;
    lca(a[u][i],u);    
    }
                
    for(int i=0;i<q[u].size();i++){
        int e=q[u][i];
        if(vis[e]) {
        int r=find(e);
        cout<<dep[e]+dep[u]-2*dep[r]<<'\n';    
        }
    }
    
    anc[u]=find(fa);
    vis[u]=true;
}
                                                                
int main()
{
  cin>>n;
 for(int i=1;i<=n;i++) 
 anc[i]=i;
    
   for(int i=1;i<n;i++) {
      int u,v; 
    cin>>v>>u;
      a[v].push_back(u);
      a[u].push_back(v);
  }
  cin>>m;
  for(int i=1;i<=m;i++) { 
      int u,v; 
    cin>>v>>u;
    q[u].push_back(v);
      q[v].push_back(u);
      
  }
   dfs(1,1,1);
   lca(1,1); 
    return 0;

}

```c++



```

  • 写回答

1条回答 默认 最新

  • KTFinn 2023-04-17 21:15
    关注

    在你的代码中,似乎缺少了对树上两个节点的 LCA(最近公共祖先)的求解。在 lca 函数中,你只是递归地遍历了每个节点,并标记了它们为已访问,但是没有进行 LCA 的求解。

    为了解决这个问题,你需要修改 lca 函数,使其能够正确地求解每个查询的 LCA 并计算最短距离。以下是修改后的代码:

    void lca(int u, int fa) {
        anc[u] = u; // 初始化每个节点的祖先为自己
        for (int i = 0; i < a[u].size(); i++) {
            int v = a[u][i];
            if (v == fa) continue;
            lca(v, u);
            anc[v] = u; // 更新 v 的祖先为 u
        }
        vis[u] = true; // 标记节点 u 为已访问
        for (int i = 0; i < q[u].size(); i++) {
            int v = q[u][i];
            if (vis[v]) {
                int r = find(v); // 求解 v 和 u 的 LCA
                cout << dep[v] + dep[u] - 2 * dep[r] << '\n'; // 计算最短距离
            }
        }
    }
    
    

    在 lca 函数中,我们对每个节点的祖先进行了初始化,并在递归中更新了每个节点的子孙的祖先。在处理完每个节点的子节点后,我们标记了该节点为已访问,并对其所有查询进行处理。对于每个查询 (u, v),如果节点 v 已被访问,则通过 find(v) 求解 v 和 u 的 LCA,并使用 LCA 计算 u 和 v 的最短距离。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月12日

悬赏问题

  • ¥60 求一个图片处理程序,要求将图像大小跟现实生活中的大小按比例联系起来的
  • ¥50 求一位精通京东相关开发的专家
  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了