JLOI2009 二叉樹問題

2022-05-09 15:09:42 字數 1598 閱讀 5110

嘟嘟嘟

對於求深度和寬度都很好維護。深度dfs時維護就行,寬度統計同乙個深度的節點有多少個,然後取max。

對於求距離,我剛開始以為是要走到根節點在回來,然後固輸了(dep[u] - 1) * 2 + dep[v] - 1,結果竟然得了80分,資料有點水過頭了……

實際上就是求lca,然而因為只求一次,所以暴力就行啦~~

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11

using

namespace

std;

12#define enter puts("")

13#define space putchar(' ')

14#define mem(a) memset(a, 0, sizeof(a))

15 typedef long

long

ll;16 typedef double

db;17

const

int inf = 0x3f3f3f3f;18

const db eps = 1e-8;19

const

int maxn = 105;20

inline ll read()

2125

while(isdigit(ch))

26if(last == '

-') ans = -ans;

27return

ans;28}

29 inline void

write(ll x)

3035

36int

n, s, t;

37 vectorv[maxn];

3839

intdep[maxn], fa[maxn];

40bool

vis[maxn];

41void dfs(int

now)

4252}53

}5455int cnt[maxn], max_dep = -1, max_wid = -1;56

57int lca(int x, int

y)58

//一定要有等於,否則同一深度就無限迴圈了

63else

if(dep[x] < dep[y]) 64}

65return

ret;66}

6768

intmain()

6976 s = read(); t =read();

77 dep[1] = 1

;78 dfs(1

);79

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

8084

write(max_dep); enter; write(max_wid); enter;

85write(lca(s, t));

86//

write(((dep[s] - 1 ) << 1) + dep[t] - 1); enter;

87return0;

88 }

view code

洛谷 P3884 JLOI2009 二叉樹問題

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

洛谷P3884 JLOI2009 二叉樹問題

題目描述 如下圖所示的一棵二叉樹的深度 寬度及結點間距離分別為 深度 4 寬度 4 同一層最多結點個數 結點間距離 為8 3 2 2 8 為3 1 2 1 3 注 結點間距離的定義 由結點向根方向 上行方向 時的邊數 2,與由根向葉結點方向 下行方向 時的邊數之和。輸入輸出格式 輸入格式 輸入檔案第...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...