tree
求樹上兩點最短距離不超過 k 的對數。
通過樹的分治的方法,從根節點自上而下開始求其不同子樹上的兩點通過該點的最短距離小於 k 的對數。
有兩點需要注意:
1. 求某節點不同子樹滿足條件的兩點不好直接求。可以通過先求該節點的所有子節點滿足條件的個數,然後減去其子樹內所有滿足條件的點的個數。這個通過 dfs 很容易實現。
2. 在分治的過程中,在找某子樹滿足條件的點對數的時候,可以從樹的重心開始找,這樣可以避免演算法時間複雜度退化。
#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int max = 10005;
struct node;
vectorg[max];
int vis[max];
int getsize(int u,int fa)
return tot;
}void dfs(int u)
}}void init(int n)
sum = 0;
memset(vis,0,sizeof(vis));
}int main()
dfs(1);
printf("%d\n",sum);
}return 0;
}
POJ 1741 樹的分治
題意就是求樹上距離小於等於k的點對有多少個 n2的演算法肯定不行,因為1w個點 這就需要分治。可以看09年漆子超的 本題用到的是關於點的分治。乙個重要的問題是,為了防止退化,所以每次都要找到樹的重心然後分治下去,所謂重心,就是刪掉此結點後,剩下的結點最多的樹結點個數最小。每次分治,我們首先算出重心,...
poj 1741 樹的分治
看了網上各種大神的樹的分治的模板,然後自己敲了乙個。直接上 了,晚上再寫乙個學習筆記,喪心病狂的poj,上次一直跪在vector上,這次覺得不用vector寫了。include include include include include include include define ll lon...
POJ 1741 樹分治入門
include include include include using namespace std const int inf 0x3f3f3f3f const int max 1e4 5 點分治 cursize 樹當前大小 curroot 當前樹的根 son i 節點i的子節點的個數 d i ...