2 条题解

  • 0
    @ 2025-10-8 16:57:48
    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e3+10;
    vector<int>G[N]; 
    int D,dep[N],st[N][20];
    void dfs(int x,int xfa)
    {
        dep[x]=dep[xfa]+1;
        st[x][0]=xfa;for(int i=1;i<=D;i++)st[x][i]=st[ st[x][i-1] ][i-1];
        for(int y:G[x])if(y!=xfa)
            dfs(y,x);
    }
    int LCA(int x,int y)
    {
        if(dep[x]<dep[y])swap(x,y); 
        for(int i=D;i>=0;i--)if(dep[st[x][i]]>=dep[y] )x=st[x][i];
        if(x==y) return x;
    	for(int i=D;i>=0;i--)if(st[x][i]!=st[y][i])x=st[x][i],y=st[y][i];
        return st[x][0];
    }
    int main()
    {
        int n,m;scanf("%d%d",&n,&m);
        for(int i=2,x;i<=n;i++)
        {
            scanf("%d",&x);
            G[x].push_back(i);
        }
        D=log2(n);memset(dep,0,sizeof(dep));memset(st,0,sizeof(st));
        dfs(1,0);
        for(int i=1,x,y;i<=m;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",LCA(x,y));
    • 0
      @ 2025-10-8 16:57:41
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e3+10;
      vector<int>G[N]; 
      int D,dep[N],st[N][20];
      void dfs(int x,int xfa)
      {
          dep[x]=dep[xfa]+1;
          st[x][0]=xfa;for(int i=1;i<=D;i++)st[x][i]=st[ st[x][i-1] ][i-1];
          for(int y:G[x])if(y!=xfa)
              dfs(y,x);
      }
      int LCA(int x,int y)
      {
          if(dep[x]<dep[y])swap(x,y); 
          for(int i=D;i>=0;i--)if(dep[st[x][i]]>=dep[y] )x=st[x][i];
          if(x==y) return x;
      	for(int i=D;i>=0;i--)if(st[x][i]!=st[y][i])x=st[x][i],y=st[y][i];
          return st[x][0];
      }
      int main()
      {
          int n,m;scanf("%d%d",&n,&m);
          for(int i=2,x;i<=n;i++)
          {
              scanf("%d",&x);
              G[x].push_back(i);
          }
          D=log2(n);memset(dep,0,sizeof(dep));memset(st,0,sizeof(st));
          dfs(1,0);
          for(int i=1,x,y;i<=m;i++)
          {
              scanf("%d%d",&x,&y);
              printf("%d\n",LCA(x,y));
          }
          return 0;
      }
      • 1

      【LCA练习】[USACO11MAR] Meeting Place S

      信息

      ID
      1554
      时间
      1000ms
      内存
      128MiB
      难度
      9
      标签
      递交数
      12
      已通过
      6
      上传者