本帖最后由 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;
}
|