嘟嘟嘟
對於求深度和寬度都很好維護。深度dfs時維護就行,寬度統計同乙個深度的節點有多少個,然後取max。
對於求距離,我剛開始以為是要走到根節點在回來,然後固輸了(dep[u] - 1) * 2 + dep[v] - 1,結果竟然得了80分,資料有點水過頭了……
實際上就是求lca,然而因為只求一次,所以暴力就行啦~~
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include10 #include11view codeusing
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 }
洛谷 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的所在子樹...