AcWing 1172 祖孫詢問(lca)

2021-10-08 00:28:05 字數 1190 閱讀 2608

給定一棵包含 n 個節點的有根無向樹,節點編號互不相同,但不一定是 1∼n。

有 m 個詢問,每個詢問給出了一對節點的編號 x 和 y,詢問 x 與 y 的祖孫關係。

輸入第一行包括乙個整數 表示節點個數;

接下來 n 行每行一對整數 a 和 b,表示 a 和 b 之間有一條無向邊。如果 b 是 −1,那麼 a 就是樹的根;

第 n+2 行是乙個整數 m 表示詢問個數;

接下來 m 行,每行兩個不同的正整數 x 和 y,表示乙個詢問。

對於每乙個詢問,若 x 是 y 的祖先則輸出 1,若 y 是 x 的祖先則輸出 2,否則輸出 0。

1≤n,m≤4×104,

1≤每個節點的編號≤4×104

lca

#include

using

namespace std;

typedef

long

long ll;

typedef pair<

int,

int> pii;

typedef

unsigned

long

long ull;

const

int n=

40010

,m=n*2;

int n,m;

int h[n]

,e[m]

,ne[m]

,idx;

int depth[n]

,fa[n][16

];int q[n]

;void

add(

int a,

int b)

void

bfs(

int root)}}

}int

lca(

int a,

int b)

if(a==b)

return a;

for(

int k=

15;k>=

0;k--)if

(fa[a]

[k]!=fa[b]

[k])

return fa[a][0

];}int

main()

bfs(root)

; cin>>m;

while

(m--

)return0;

}

JZ3054祖孫詢問

題目 已知一棵n個節點的有根樹。有m個詢問。每個詢問給出了一對節點的編號x和y,詢問x與y的祖孫關係。分析 dfs序以及各種求lca演算法均可秒殺此題。dfs遍歷樹,記錄每個點x的第一次訪問時間st x 和最後一次訪問時間ed x 若y在以x為根的子樹中,則一定有st x 附上 const maxn...

CQYZ OJ Contest 133 祖孫詢問

同步 已知一顆有根樹。有m個詢問。每個詢問給出了一對節點x,y,輸出x,y的祖孫關係 第一行節點數目n接下來n行,每行一對整數a,b,表示a和b之間有邊。如果b 1,那麼a就是數根接下來是乙個整數m,表示詢問的個數接下來m行,每行兩個正整數x,y 對於每乙個詢問,如果x是y的祖先,輸出1 如果y是x...

最近公共祖先 祖孫詢問

給定一棵包含 nn 個節點的有根無向樹,節點編號互不相同,但不一定是 1 n1 n 有 mm 個詢問,每個詢問給出了一對節點的編號 xx 和 yy 詢問 xx 與 yy 的祖孫關係。輸入格式輸入第一行包括乙個整數 表示節點個數 接下來 nn 行每行一對整數 aa 和 bb 表示 aa 和 bb 之間...