我們把一棵樹的最長的路徑稱作為數的直徑。
怎麼求數的直徑?
1、從任意乙個節點出發,用bfs或者dfs遍歷,找到最長路徑的最後乙個點,那個就是直徑的乙個端點a。
2、從乙個端點a出發,再次使用bfs或者dfs遍歷,找到最長路徑的最後乙個點,就是直徑的另外乙個端點b。
也就是要兩次遍歷。
這個,最直觀的思路就是求出數的直徑,記錄兩個端點a,b,然後迴圈每個節點,計算這個結點到兩個端點的距離,取最長的那個。
但是如果逆過來思考的話,那就是從a端點出發,遍歷每個結點,然後記錄a到各個結點的路徑長度;然後從b端點出發,遍歷每個結點,然後記錄b到各個結點的路徑長度。
#include
#include
#include
using
namespace std;
struct point
;vector g[
10010];
bool visit[
10010];
int n,dis[
10010];
intbfs
(int begin)
queue<
int>q;q.
push
(begin)
;visit[begin]=1
;dis[begin]=0
;while
(!q.
empty()
)}}int ans=
0,themax=0;
for(
int i=
1;i<=n;i++)if
(dis[i]
>themax)
return ans;
}int
main()
//尋找樹的直徑的兩個端點
int v1=
bfs(1)
;//第乙個端點
//從第乙個端點開始遍歷這個圖
int v2=
bfs(v1)
;//第二個端點
for(
int i=
1;i<=n;i++
) maxdis[i]
=dis[i]
;//到第乙個端點的距離
bfs(v2)
;//從第二個端點開始遍歷這個圖
for(
int i=
1;i<=n;i++
)printf
("%d\n"
,maxdis[i]);
}}return0;
}
樹的直徑應用問題
題意 輸入檔案包含多組測試資料。對於每組測試資料,第一行乙個整數n n 10000 接下來有n 1行,每一行兩個數,對於第i行的兩個數,它們表示與i號電腦連線的電腦編號以及它們之間網線的長度。網線的總長度不會超過10 9,每個數之間用乙個空格隔開。輸出 對於每組測試資料輸出n行,第i行表示i號電腦的...
二叉樹直徑問題
二叉樹的直徑 根據題目意思,所謂二叉樹的直徑,就是以某一結點為根,左右子樹深度之和減1。二叉樹的題目,不用多說,肯定是遞迴遍歷框架。後序 void lastorder treenode root 考慮的重點在於,後序中的操作是什麼,左右子樹返回什麼。顯然,對於當前訪問的結點,我們的目標是以它為根的直...
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...