樹的重心:對於一顆n個結點的無根樹,找到乙個點,使得把樹變成以該點為跟的有根樹時,最大子樹的結點數最小,就是說如果刪除這個點後,所形成的森林中,最大的樹的結點數最小。
性質:<1>樹中所有結點到某個點的距離和中,到重心的距離和是最小的,如果有兩個距離和,則他們的距離和一樣。
<2>把兩棵樹通過一條邊相連,新的樹的重心在原來兩棵樹重心的連線上。
<3>一棵樹新增或者刪除乙個結點,樹的重心最多隻移動一條邊的位置。
<4>一棵樹最多有兩個重心且相鄰。
dfs求樹的重心:(poj3107板子題,但是這個**會t,換成前向星才能過)
d[i]表示:以i為根的子樹的結點個數,在dfs的過程中就可以求出,所以根據樹的重心的定義就可以比較清楚地寫出來這個**。siz代表的就是總答案,res代表以now為根節點的區域性答案,我們每回需要計算的res=max,即我的每個子樹的結點個數和除我這棵樹以外的結點當子樹的結點個數的最大值。回溯的時候一步步上來就行了。
#include #include #include using namespace std;
const int maxn=50005;
const int inf=0x7fffffff;
vectore[maxn];
int n;
int d[maxn];
int siz;
vectorid;
void dfs(int now,int pre)
siz=inf;id.clear();
dfs(1,-1);
sort(id.begin(),id.end());
for(int i=0;icout<}
學習筆記 樹的重心
給定一顆樹,樹中包含n個結點 編號1 n 和n 1條無向邊。請你找到樹的重心,並輸出將重心刪除後,剩餘各個連通塊中點數的最大值。重心定義 重心是指樹中的乙個結點,如果將這個點刪除後,剩餘各個連通塊中點數的最大值最小,那麼這個節點被稱為樹的重心。輸入格式 第一行包含整數n,表示樹的結點數。接下來n 1...
樹的直徑與重心學習筆記
此文為完成任務所設,可能不易懂,能看懂就將就著看吧 樹的定義 不存在環且聯通的圖。樹的直徑 樹中的最長鏈 樹的重心 為乙個點,以此點為根,最大子樹的大小最小。樹的直徑求法分兩種 兩次 dfs bfs 與樹形 dp 首先講好理解點的樹形 dp 其實很簡單,每個節點維護子樹到這個點的最長鏈和次長鏈。對於...
樹的直徑 樹的重心與樹的點分治學習筆記
樹的直徑是指樹上的最長簡單路。任選一點w為起點,對樹進行搜尋,找出離w最遠的點u。以u為起點,再進行搜尋,找出離u最遠的點v。則u到v的路徑長度即為樹的直徑。簡單證明 如果w在直徑上,那麼u一定是直徑的乙個端點。反證 若u不是端點,設直徑的兩端為s與t,則dist w,u dist u,t 且dis...