最近在複習比較簡單的知識,順便當整理**吧。
樹的直徑是乙個經典問題,即求樹上最遠兩點的距離。
思路一:
任取乙個點,求這個點的最遠點的最遠點,兩遍bfs即可。
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includeview code8 #include 9 #include 10 #include 11 #include 12 #include
13 #include 14 #include 15 #include 16
17using
namespace
std;
1819
const
int inf = 1
<<30;20
21struct
graph
3233 inline void addedge(int u, int
v) 38
};39
40const
int maxn = (int) 1e5+55;41
42graph g;
43int
que[maxn];
44int
d[maxn];
45int
n;46
47void bfs(int
st) 60}
61}6263
void
solve()
6869
intmain()
82solve();83}
8485
return0;
86 }
另一種思路是樹形dp,一棵樹中的最長路要麼在子樹中,要麼經過根。列舉每棵子樹的最大深度和次大深度即可。
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #includeview code8 #include 9 #include 10 #include 11 #include 12 #include
13 #include 14 #include 15 #include 16
17using
namespace
std;
1819
const
int inf = 1
<<30;20
21struct
graph
3233 inline void addedge(int u, int
v) 38
};39
40graph g;
4142
const
int maxn = (int) 1e5+55;43
44int
dp[maxn];
45int
ans;
4647
int dfs(int u, int pre, int
cnt)
56else
if (t>se) se =t;57}
58 ans = max(ans, max(fi+cnt, fi+se));
59return fi+1;60
}6162int
main()
75 ans = 0
;76 dfs(1, 1, 0
);77 printf("
%d\n
", ans);78}
7980
return0;
81 }
順便說一下,hiho上這個題的資料比較弱,開始我幾個錯誤的**都a了。
hiho 1050 樹中的最長路
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述上回說到,小ho得到了一棵二叉樹玩具,這個玩具是由小球和木棍連線起來的,而在拆拼它的過程中,小ho發現他不僅僅可以拼湊成一棵二叉樹!還可以拼湊成一棵多叉樹 好吧,其實就是更為平常的樹而已。但是不管怎麼說,小ho喜愛的玩具又...
hiho 1050 樹中的最長路
題目大意 給出一棵樹,其中每兩個節點都可以形成乙個路徑 要求路徑中的邊只能走一次 求出所有路徑中的長度最大值。分析 由於樹的任何乙個節點均可以作為根節點,因此dfs時候,選擇1即可。實現 pragma once pragma execution character set utf 8 本檔案為utf...
hiho 1050 樹中的最長路 樹的直徑
時間限制 10000ms 單點時限 1000ms 記憶體限制 256mb 描述上回說到,小ho得到了一棵二叉樹玩具,這個玩具是由小球和木棍連線起來的,而在拆拼它的過程中,小ho發現他不僅僅可以拼湊成一棵二叉樹!還可以拼湊成一棵多叉樹 好吧,其實就是更為平常的樹而已。但是不管怎麼說,小ho喜愛的玩具又...