洛谷 P3398 倉鼠找sugar(樹剖,LCA)

2022-02-13 12:52:38 字數 1025 閱讀 2325

很顯然,就是在一棵樹上,求兩條路徑有沒有交點。

我們可以先分別求出兩條路徑兩段點的lca,設為rtab和rtcd然後分以下情況討論:

這時候可能會發現,會不會rtab和rtcd的深度相同這種情況呢?

如果rtab和rtcd深度相同卻又不是同乙個節點(若是同乙個節點在第一種情況裡已經判斷),顯然兩條路徑不可能有交點。

**就是先樹剖剖一下,然後對於每個詢問求上述情況的lca,判斷輸出即可。

#include#include

#include

#include

#include

using

namespace

std;

const

int maxn=100005

;int

cnt,p[maxn],fa[maxn],deep[maxn],top[maxn],size[maxn],son[maxn];

intn,q;

struct

nodee[maxn*2

]; void insert(int u,int

v)void dfs1(int u,int f,int

dep)

}}void dfs2(int u,int

topp)

}int findrt(int x,int

y)

return deep[x]>deep[y]?y:x;

}int

main()

dfs1(

1,-1,1

); dfs2(

1,1);

for(int i=1;i<=q;i++)

if(rtab==rtcd||(deep[rtab]>deep[rtcd]&&(rtc1==rtab||rtd1==rtab))||(deep[rtab]"

y\n"

);

else printf("

n\n"

); }

return0;

}

洛谷P3398 倉鼠找sugar

裸的lca。對於每次詢問,設a,b的lca為a,c,d的lca為b,分兩種情況討論 1 a與b的深度相同,此時二人相遇的充要條件為a b,即四個點的最近公共祖先相同。2 a與b深度不同,設a的深度大於b的深度,若二人相遇,則c或d與a的lca一定為a。include include define m...

洛谷P3398 倉鼠找sugar

題目大意 給你一棵 n n leqslant10 5 個點的樹,m m leqslant10 5 次詢問,每次詢問路徑 a b 和路徑 c d 是否有交點 題解 經過觀察發現若有交點,在 lca 或 lca 一定有交,判斷一下即可 卡點 無 c code include include includ...

洛谷 3398 倉鼠找sugar

題目描述 小倉鼠的和他的基 me i mei mei 友 zi sug ar zi sugar zi su gar住在地下洞穴中,每個節點的編號為1 n1 n 1n。地下洞穴是乙個樹形結構。這一天小倉鼠打算從從他的臥室 a a a 到餐廳 b b b 而他的 同時要從他的臥室 c c c 到圖書館 ...