樹直徑問題

2021-10-04 16:45:44 字數 1303 閱讀 9121

我們把一棵樹的最長的路徑稱作為數的直徑。

怎麼求數的直徑?

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...