|
发表于 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;
- }
复制代码
|
|