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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

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

發布時間:2023/12/3 c/c++ 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 牛客题霸 [ 树的直径] C++题解/答案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

牛客題霸 [ 樹的直徑] C++題解/答案

題目描述

給定一棵樹,求出這棵樹的直徑,即兩個節點距離的最大值。

題解:

不知道大家聽沒聽過一個結論:
樹的直徑可以通過兩邊dfs找到
步驟:
1.從任意一點進行dfs,然后找到一個最長路徑,記錄最遠點u
2.然后從u再進行dfs,找最長路徑,記錄一點v。
(u,v)就是樹的直徑
證明:

我們可以看出圖中,樹的直徑是(4->2->5),長度為9.
我們一開始選定一個點dfs
如果是直徑外一點,比如w1,從w1進行dfs找到的就是點4,路徑就1->2->4,這個路徑一定會與樹的直徑相交,而找到的4是直徑的一端,那從4再進行dfs就是樹的直徑的另一端5,這樣兩遍dfs你就找到了樹的直徑
如果是直徑內一點,比如w2,從w2開始dfs找到的最遠點4,這個路徑會被包含在樹的直徑里,那找到的點也就是樹直徑的一端,再dfs就可以找到另一端。
綜上用兩遍dfs就可以找到樹的直徑


其實求直徑也就是求深度,所以我們dfs直接求樹的深度,并記錄最大深度,以及對應的節點,然后再帶入到第二遍dfs即可

代碼:

/*** struct Interval {* int start;* int end;* };*/class Solution { public:/*** 樹的直徑* @param n int整型 樹的節點個數* @param Tree_edge Interval類vector 樹的邊* @param Edge_value int整型vector 邊的權值* @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;} };

總結

以上是生活随笔為你收集整理的牛客题霸 [ 树的直径] C++题解/答案的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。