給定一棵包含 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 之間...