今天寫了道樹的直徑的題,其實以前也看過,那時候並不專注,沒看懂,現在發現就只是兩遍bfs的事,但是原理並沒有這麼簡單
我來簡單說一下
我們隨便在樹中找乙個點u,然後開始bfs找到最遠的一點v,在之後就是關鍵部分,我們再從v開始bfs,找到的最遠距離就是直徑。
說到這裡,就有很多人看不懂了,因為並不能說明v就是直徑的乙個端點,這裡要通過反證法來證明
看不懂也不要緊,只要記住v就是直徑的乙個端點,然後再一遍bfs就可以得出答案
**如下:
#include #include #include #include #include #include #include #include #include #include #define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
struct edge
;vectore[100000];
int vis[100000];
ll ans,dis[100000];
void add(int u,int v,int w)
int bfs(int x)
int len=e[u].size();
for(int i=0;i這裡的ans=-99999有點坑,第一遍寫的時候這裡卡了4%的資料,要注意
樹的重心 樹的直徑
樹的重心 樹的重心定義為 找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡.實際上樹的重心在樹的點分治中有重要的作用,可以避免n 2的極端複雜度 從退化鏈的一端出發 保證nlogn的複雜度,利用樹型dp可以很好地求樹的重心.求樹的重心 模...
樹的直徑 樹的重心
樹的直徑 定義 那麼樹上最遠的兩個點,他們之間的距離,就被稱之為樹的直徑。樹的直徑的性質 1.直徑兩端點一定是兩個葉子節點。2.距離任意點最遠的點一定是直徑的乙個端點,這個基於貪心求直徑方法的正確性 可以得出。3.對於兩棵樹,如果第一棵樹直徑兩端點為 u,v 第二棵樹直徑兩端點為 x,y 用條邊將兩...
SDOI2013 直徑(樹的直徑)
小q最近學習了一些圖論知識。根據課本,有如下定義。樹 無迴路且連通的無向圖,每條邊都有正整數的權值來表示其長度。如果一棵樹有n個節點,可以證明其有且僅有n 1 條邊。路徑 一棵樹上,任意兩個節點之間最多有一條簡單路徑。我們用 dis a,b 表示點a和點b的路徑上各邊長度之和。稱dis a,b 為a...