樹的相關問題 未完

2022-09-19 13:36:12 字數 1016 閱讀 6868

定義:樹上最長的簡單路徑

求法:兩次dfs,首先在樹上找到離任意一點最遠的一點a,再找到離a點最遠的點b,可以證明a、b為直徑的兩條端點

**#include#define pb push_back

using namespace std;

inline int read()

const int n=1010;

struct edge;

vectorv[n];

int n,dis[n];

int ans,now;//分別表示直徑長度和端點編號

void dfs(int x,int fa)

for(int i=0;i

重要性質:

1. 距離樹上任意點最遠的點一定是直徑的端點

2. 若一棵樹有多條直徑,那麼這些路徑的中點為同一點,且這個點被稱為樹的中心定義:若以乙個節點為根時,該樹的最大子樹最小,則稱這個點為樹的重心

性質:1.最大的子樹最小

2.找到乙個點,其所有的子樹中最大的子樹節點數最少,那麼這個點就是這棵樹的重心,刪去重心後,生成的多棵樹盡可能平衡

3.樹中所有點到某個點的距離和中,到重心的距離和是最小的,如果有兩個距離和,他們的距離和一樣,則這兩個點都是重心(即重心可以有兩個)

4.把兩棵樹通過一條邊相連,新的樹的重心在原來兩棵樹重心的連線上

5.一棵樹新增或者刪除乙個節點,樹的重心最多隻移動一條邊的位置

6.一棵樹最多有兩個重心,且相鄰。

求法:任選節點r為根節點做dfs,dfs的同時即更新所有的d(當前子樹的大小),以及最小的最大子樹,注意當前子樹的最大子樹要考慮其父節點向上的樹

**#include #define pb push_back

using namespace std;

const int n=1010;

vectorv[n];

int n,sz[n];

int ans;

void dfs(int x,int fa)

dfs(1,0);

cout<

線段樹 乙個簡單的整數問題(未完)

你有n個整數,a1,a2,an。你需要處理兩種操作。一種操作是在給定間隔中為每個數字新增一些給定數字。另一種是要求給定間隔中的數字總和。第一行包含兩個數字n和q.1 n,q 100000。第二行包含n個數字,a1,a2,an的初始值。1000000000 ai 1000000000。接下來的q行中的...

生成樹相關問題整理

摘要 在對最小生成樹演算法有一定理解後,我們對典型的最小生成樹題型應該不難解決,但是對於由最小生成樹模型變形而來的幾種模型,我們仍需做一次總結與記錄。首先我們需要提出最小生成樹幾個性質,便於推導演算法 然後我們將介紹6種最小生成樹相關問題模型,並討論一般解法與更優解法 其中有的解法顯而易見,接受起來...

決策樹相關問題

bagging與boosting 參考資料 決策樹是一種典型的採用貪心策略的分類模型,即用區域性最優解去逼近全域性最優解。在整個分類過程中,核心的指標是 不純度 impurity 也就是分得 開不開 因為對於分類問題,我們總是期望能夠把資料盡可能地不相交地隔開 比較svm的基本思想 尋找最大間隔分離...