洛谷P3884 JLOI2009 二叉樹問題

2022-03-17 16:02:56 字數 1753 閱讀 2298

題目描述

如下圖所示的一棵二叉樹的深度、寬度及結點間距離分別為:

深度:4 寬度:4(同一層最多結點個數)

結點間距離: ⑧→⑥為8 (3×2+2=8)

⑥→⑦為3 (1×2+1=3)

注:結點間距離的定義:由結點向根方向(上行方向)時的邊數×2,

與由根向葉結點方向(下行方向)時的邊數之和。

輸入輸出格式

輸入格式:

輸入檔案第一行為乙個整數n(1≤n≤100),表示二叉樹結點個數。接下來的n-1行,表示從結點x到結點y(約定根結點為1),最後一行兩個整數u、v,表示求從結點u到結點v的距離。

輸出格式:

三個數,每個數占一行,依次表示給定二叉樹的深度、寬度及結點u到結點v間距離。

輸入輸出樣例

輸入樣例#1

10                               

1 2                           

1 3                            

2 42 5

3 63 7

5 85 9

6 10

8 6輸出樣例#144

8演算法:

最近公共祖先(lca)倍增

分析:

看題看了很久都沒看懂,後來才發現這個是乙個幾乎lca的模板問題,只用把路徑處理一下就好了,這裡採用倍增的演算法。

上**:

1 #include2

#define max(a,b) a>b?a:b

3#define swap(a,b) a^=b^=a^=b

4#define maxn 110

5using

namespace

std;67

int n,m,s,tot,head[maxn],deep[maxn],p[maxn][20],md,t[10

],ans;

8struct

node

9edge[maxn<<1

];12

13int

read()

1423

24void add(int a,int

b)25

;27 head[a]=tot;

28 edge[++tot]=(node);

29 head[b]=tot;30}

3132

void

init()

3339

40int dfs(int

u)4149}

5051

int lca(int a,int

b)52

69return p[a][0

];70}71

72int

main()

73

洛谷 P3884 JLOI2009 二叉樹問題

傳送門 明顯是求公共祖先,所以我們可以採用傳統的lca lcalc a演算法對於深度和寬度,我們在預處理就已經解決了,其他都是普通的lca lcalc a演算法 include include include include include include include include inclu...

洛谷P3261 JLOI2015 城池攻占

不得不說,這道題目是真的難,真不愧它的 省選 noi 的紫色大火題!花了我晚自習前半節課看題解,寫 又花了我半節晚自習調 真的心態 基本上改得和題解完全一樣了我才過了這道題!真的煩。沒事,那接下來我來完全把這道題搞透。part 1 理解題目 至少我一開始不知道為什麼要用左偏樹,甚至我看題解一開始也都...

洛谷P3261 JLOI2015 城池攻占

思路分析 由於這道題的資料範圍是n,m 3e5,所以我們直接輸入乙個模擬乙個是會超時的,但是我們可以在輸入所有的士兵之後把同在乙個節點的士兵一起處理,我們可以考慮建乙個堆,從深度最大的節點開始,維護乙個節點內的士兵的最小戰鬥力值,如果戰鬥力最小的士兵都能存活下來,那麼在堆中的其他士兵一定可以活下來,...