定義:樹上最長的簡單路徑
求法:兩次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的基本思想 尋找最大間隔分離...