description
給出一棵帶邊權的樹,問有多少對點的距離<=len
c表示最大兒子的節點的size
size表示子樹大小
處理子樹大小
void get_size(int x,int y)
}
找重心
//size[r]-size[x]是x上面部分的樹的尺寸,跟x的最大孩子比,找到最大孩子的最小差值節點
void get_root(int r,int x,int y)
}
求每個點離重心的距離
void get_dis(int x,int
sum,int y)
}
計算以x為根的子樹中有多少點對的距離小於等於len
int calc(int x,int
sum)
大肥水
void dfs(int x)
}}
code
#include
#include
#include
#define fo(i,a,b) for (int i=a;i<=b;i++)
#define n 10005
using namespace std;
int n,len,l=0,ans=0,max=0,root=0;
int t[n*2],last[n],next[n*2],val[n*2],size[n],c[n],dis[n],num=0;
bool bz[n];
void add(int
x,int
y,int z)
void get_size(int
x,int
y)
}void get_root(int r,int
x,inty)}
void get_dis(int
x,int sum,inty)}
int calc(int
x,int sum)
void dfs(int
x) }
}int main()
dfs(1);
printf("%d\n",ans);
return
0;}
點分治模板 (樹中點對距離)
點分治就是在一棵樹中,將每個點分治 基本概念 點分治 將一棵無根樹變成有根樹,再分別處理每棵有根子樹。重心 在一棵樹中,這個點的最大子樹是所有點中最小的。也可以說是刪除該點時,樹內剩下的子樹最大節點數最小。size i 表示以i為根的子樹節點數量。如何求重心?求出size,什麼是定義,就怎麼求。一般...
樹中點對距離(點分治)
給出一棵帶邊權的樹,問有多少對點的距離 len 這是一道點分治的經典題目,可以給點分治的初學者練手。點分治,顧名思義就是把每個點分開了處理答案。假設,目前做到了以x為根的子樹。先求出子樹中每個點到根的距離di s 對於兩個點 i 和 j,如果di si d isj k 那麼 i j 就是乙個合法的點...
點分治入門 樹中點對距離詳(?)解
其中樹最多有10000個點,len maxlongint 這是一道模板題目。對於乙個點x,我們考慮如何求解經過x點的路徑方案數,設為f x 考慮直接從x出發做一遍dfs,算出所有未到過的點到x點的距離,然後排序。設兩個指標,如果length l length r len,那麼length l len...