日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

牛客题霸 [ 树的直径] C++题解/答案

發(fā)布時(shí)間:2023/12/3 c/c++ 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客题霸 [ 树的直径] C++题解/答案 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

牛客題霸 [ 樹(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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。