|  | 
 
 发表于 2022-7-14 18:14:45
|
显示全部楼层 
| 本帖最后由 jhq999 于 2022-7-14 18:30 编辑 
 看看,没看明白
 只能自己写一个还没通过
   
 复制代码void huisu(int* a,int n,int pt1,int pt2)
{
    if(pt1==a[0]||pt2==a[0])printf("%d\n",a[0]);
    else
    {
        int i=0,j=0,pt3=pt1,pt4=pt2;
        while(pt3!=a[0])pt3=a[pt3],i++;//////计算到根节点的深度
        while(pt4!=a[0])pt4=a[pt4],j++;//////计算到根节点的深度
        pt3=pt1,pt4=pt2;
        while(1)////////跑到相同的深度
        {
            if(i==j)break;
            i>j?(pt3=a[pt3],i--):(pt4=a[pt4],j--);
        }
        while(pt3!=pt4)////////假如相同深度的值相同就是共同祖先
        {
            pt3=a[pt3],pt4=a[pt4];
        }
        printf("%d\n",pt3);
    }
}
int main()
{
    int n=0,m=0,s=0,i=0,id=0,parent=0;
    scanf("%d%d%d",&n,&m,&s);
    int* a=(int*)calloc(n+1,sizeof(int));
    int (*b)[2]=(int (*)[2])calloc(m*2,sizeof(int));
    a[0]=s;
    for(i=0;i<n-1;i++)
    {
        scanf("%d%d",&id,&parent);
        a[id]=parent;/////每个节点存储的是父节点下标
    }
    for(i=0;i<m;i++)
    {
        scanf("%d%d",b[i],b[i]+1);
    }
    for(i=0;i<m;i++)
    {
        huisu(a,n,b[i][0],b[i][1]);
    }
    free(b);
    free(a);
    return 0;
}
 | 
 |