牛客题霸 [ 树的直径] C++题解/答案
牛客題霸 [ 樹(shù)的直徑] C++題解/答案
題目描述
給定一棵樹(shù),求出這棵樹(shù)的直徑,即兩個(gè)節(jié)點(diǎn)距離的最大值。
題解:
不知道大家聽(tīng)沒(méi)聽(tīng)過(guò)一個(gè)結(jié)論:
樹(shù)的直徑可以通過(guò)兩邊dfs找到
步驟:
1.從任意一點(diǎn)進(jìn)行dfs,然后找到一個(gè)最長(zhǎng)路徑,記錄最遠(yuǎn)點(diǎn)u
2.然后從u再進(jìn)行dfs,找最長(zhǎng)路徑,記錄一點(diǎn)v。
(u,v)就是樹(shù)的直徑
證明:
我們可以看出圖中,樹(shù)的直徑是(4->2->5),長(zhǎng)度為9.
我們一開(kāi)始選定一個(gè)點(diǎn)dfs
如果是直徑外一點(diǎn),比如w1,從w1進(jìn)行dfs找到的就是點(diǎn)4,路徑就1->2->4,這個(gè)路徑一定會(huì)與樹(shù)的直徑相交,而找到的4是直徑的一端,那從4再進(jìn)行dfs就是樹(shù)的直徑的另一端5,這樣兩遍dfs你就找到了樹(shù)的直徑
如果是直徑內(nèi)一點(diǎn),比如w2,從w2開(kāi)始dfs找到的最遠(yuǎn)點(diǎn)4,這個(gè)路徑會(huì)被包含在樹(shù)的直徑里,那找到的點(diǎn)也就是樹(shù)直徑的一端,再dfs就可以找到另一端。
綜上用兩遍dfs就可以找到樹(shù)的直徑
其實(shí)求直徑也就是求深度,所以我們dfs直接求樹(shù)的深度,并記錄最大深度,以及對(duì)應(yīng)的節(jié)點(diǎn),然后再帶入到第二遍dfs即可
代碼:
/*** struct Interval {* int start;* int end;* };*/class Solution { public:/*** 樹(shù)的直徑* @param n int整型 樹(shù)的節(jié)點(diǎn)個(gè)數(shù)* @param Tree_edge Interval類vector 樹(shù)的邊* @param Edge_value int整型vector 邊的權(quán)值* @return int整型*/int far,Max;vector<vector<pair<int,int> >>G;void dfs(int u,int deep,int fa){if(deep>Max){far=u;Max=deep;}for(auto &it:G[u]){int v=it.first;int w=it.second;if(v==fa)continue;dfs(v,deep+w,u);}}int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) {// write code hereG.clear(); G.resize(n + 1);for (int i = 0; i < n - 1; ++i) {Interval e = Tree_edge[i];int w = Edge_value[i];int u=e.start;int v=e.end;G[u].push_back(pair<int,int>(v, w));G[v].push_back(pair<int,int>(u, w));}far = 1; Max = 0;dfs(1, 0, 0);dfs(far, 0, far);return Max;} };總結(jié)
以上是生活随笔為你收集整理的牛客题霸 [ 树的直径] C++题解/答案的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 从头说起:基金采取券商结算模式的依据和影
- 下一篇: 牛客题霸 [ 缺失数字] C++题解/答