題目連線:poj - 1741
看了好長時間才明白了點......
網上講解很多但感覺都不夠詳細。。。大概是太弱了吧-_-||
學通了再回來寫詳解。。。
1 #include2 #include3 #include4 #include5#define ll long long
6using
namespace
std;
7const
int n=1e5+10;8
const
int inf=1e9+10;9
intn,k;
10int
rt,ans,sumnode,siz[n],vis[n],d[n];
11int dep[n]; //
路徑長度
//dep[0]為子節點個數
12int f[n]; //
重心13
struct
edge
14e[n*2
];17
inthead[n];
18int
cnt;
19void add(int u,int v,int
w)20
26void getrt(int u,int fa) //
找重心27
38 f[u]=max(sumnode-siz[u],f[u]);
39if(f[u]u;40}
4142
void getdep(int u,int fa) //
獲取子樹所有節點與根的距離
4352}53
54int cal(int u,int now) //
計算當前以重心u為根的子樹下所有情況的答案
5564
else r--;65}
66return
all;67}
6869
void work(int u) //
以u為重心計算
7083}84
intu,v,w;
85int
main()
8699 rt=ans=0
;100 sumnode=n;
101 f[0]=inf;
102 getrt(1,0
);103
work(rt);
104 printf("
%d\n
",ans);
105}
106 }
POJ 1741 樹的點分治
第一次接觸樹分治。打算今晚學的,先看了一蛤樹的重心怎麼求,之後知道了重心後再來看這道題,這種題是不是啟發式合併也可以?一遍一遍加邊地合併上去,然後列舉小的塊的每個點,二分大的塊,然而這還是要遍歷一遍小的塊再遍歷一遍大的塊才能預處理出道鏈結的兩個點的距離,就不滿足啟發式合併的nlogn了,因為要對大的...
POJ 1741 樹的分治
題意就是求樹上距離小於等於k的點對有多少個 n2的演算法肯定不行,因為1w個點 這就需要分治。可以看09年漆子超的 本題用到的是關於點的分治。乙個重要的問題是,為了防止退化,所以每次都要找到樹的重心然後分治下去,所謂重心,就是刪掉此結點後,剩下的結點最多的樹結點個數最小。每次分治,我們首先算出重心,...
POJ 1741 樹的分治
tree 求樹上兩點最短距離不超過 k 的對數。通過樹的分治的方法,從根節點自上而下開始求其不同子樹上的兩點通過該點的最短距離小於 k 的對數。有兩點需要注意 1.求某節點不同子樹滿足條件的兩點不好直接求。可以通過先求該節點的所有子節點滿足條件的個數,然後減去其子樹內所有滿足條件的點的個數。這個通過...