?? 求最近公共祖先 用求深度加快速度.txt
字號(hào):
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
#define NMAX 100002
//求最近公共祖先 用求深度加快速度
long fa[NMAX];
long shendu[NMAX];
void init(long num)
{
long i;
for(i=1;i<=num;i++)
shendu[i]=-1;
}
long getshendu(long now)
{ //求該點(diǎn)的深度
if(fa[now]==0) return 1;
//如果該點(diǎn)深度未求,轉(zhuǎn)去求父親的深度(這樣順帶把父親的深度也求了)
else if(shendu[now]==-1) {shendu[now]=getshendu(fa[now])+1;return shendu[now];}
else return shendu[now];//若已求得,直接返回
}
long cal(long a,long b)
{
//只需求所要節(jié)點(diǎn)的深度即可
getshendu(a);
getshendu(b);
//將兩點(diǎn)調(diào)整到同一深度上
while(shendu[a]<shendu[b]) b=fa[b];
while(shendu[b]<shendu[a]) a=fa[a];
while(a!=b)
{ //同時(shí)向祖先推進(jìn),直到相遇
a=fa[a];
b=fa[b];
}
return a;
}
int main()
{
long num,i,numa,a,b;
scanf("%ld",&num);
for(i=1;i<=num;i++)
scanf("%ld",&fa[i]);
init(num);
scanf("%d",&numa);
for(i=0;i<numa;i++)
{
scanf("%ld%ld",&a,&b);
printf("%ld\n",cal(a,b));
}
return 0;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -