樹的直徑就是從找到一條最長路徑(不經過重複節點) 時間複雜度o(n) 需要把整棵樹遍歷一遍
思路:動態規劃思想:求出經過各個點的最長路徑 取max 就是樹的最長路徑
#include
#include
#include
using namespace std;
const
int n =
2e4;
int h[n]
,e[n]
,ne[n]
,val[n]
,idx;
int ans =0;
int n;
void
add(
int a,
int b,
int c)
intdfs
(int u,
int fa)
//返回以其為根節點的子樹內的 以根節點為乙個端點的最大路徑
else
if(d>d2)
d2 = d;
}
ans =
max(ans,d1+d2)
;return d1;
}int
main()
dfs(1,
-1);
cout
}
中心點的定義:中心點到樹中其他結點的最遠距離最近實現**:
#include
#include
#include
#include
using namespace std;
const
int n =
2e4+10;
int h[n]
,e[n]
,ne[n]
,val[n]
,idx;
int d1[n]
;int d1_c[n]
;int d2[n]
;int d2_c[n]
;int up[n]
;int maxx;
int n;
void
add(
int a,
int b,
int c)
intdfs_down
(int u,
int fa)
else
if(d>d_maxx)
d_maxx = d,d2_c[u]
= j;
} d1[u]
= d_max;
d2[u]
= d_maxx;
return d1[u];}
void
dfs_up
(int u,
int fa)
}int
main()
dfs_down(1
,-1)
;dfs_up(1
,-1)
;
maxx =
0x3f3f3f3f
;for
(int i=
1;i<=n;i++
) maxx =
min(maxx,
max(up[i]
,d1[i]))
;
cout
}
求樹的直徑
歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...
求樹的直徑
歡迎來踩本人部落格 樹的直徑 就是樹上最長路 方法 求兩邊dfs即可 步驟 1.從任意一點進行dfs,然後找到乙個最長路徑,記錄最遠點u 2.然後從u再進行dfs,找最長路徑,記錄一點v。u,v 就是樹的直徑 第四屆藍橋杯a組 證明 我們可以看出圖中,樹的直徑是 4 2 5 長度為9.我們一開始選定...
求樹的直徑
由於之前寫了一篇部落格,用到了樹的直徑卻沒有求。在咕咕咕了n多天之後決定寫這篇部落格。樹的直徑就是樹中最長的一條路。求樹的直徑我只會一種方法 據說dalao都會2種 隨便找乙個點跑一遍最短路,找到離他最遠的節點a,然後從a節點繼續跑最短路,再次找到乙個離a最遠的節點b,a和b分別是直徑的兩個端點,他...