[POJ 1741] DP + Tree 分治
2013-02-12 20:55
447 查看
题意:
给一棵树,有边权。问边权和<=k的路径有多少条。
解法:
TreeDp+分治。漆子超的论文。。
给一棵树,有边权。问边权和<=k的路径有多少条。
解法:
TreeDp+分治。漆子超的论文。。
const int N = 1e4 + 9; int n , k , ans; struct EDGE{ int to , len , next; }edge[N << 1]; int head , tot; void addedge(int u , int v , int len){ edge[tot].to = v; edge[tot].len = len; edge[tot].next = head[u]; head[u] = tot++; } int sons , core , corecnt; int dis ; int lis , listot; bool vis ; void coredfs(int u , int v){ // Count the Sons sons[u] = 1; int ret = 1; for(int i = head[u] ; i != -1 ; i = edge[i].next){ int go = edge[i].to; if (go == v || vis[go]) continue; coredfs(go , u); sons[u] += sons[go]; } } void coreedit(int u , int v , int cnt){ //Find core int ret = 1; for(int i = head[u] ; i != -1 ; i = edge[i].next){ int go = edge[i].to; if (go == v || vis[go]) continue; coreedit(go , u , cnt); checkMax(ret , sons[go]); } checkMax(ret , cnt - sons[u]); if (ret < corecnt){ core = u; corecnt = ret; } } int Qcore(int u){ // Subtree's Core corecnt = INF; coredfs(u , 0); coreedit(u , 0 , sons[u]); return core; } void rushDis(int u , int len , int v){ lis[listot++] = len; for (int i = head[u] ; i != -1 ; i = edge[i].next){ int g = edge[i].to; if (g != v && !vis[g]) rushDis(g , len + edge[i].len , u); } } int calc(int u , int len){ int ret = 0; listot = 0; rushDis(u , len , 0); sort(lis , lis + listot); int head = 0 , tail = listot - 1; while(head < tail){ while(head < tail && lis[head] + lis[tail] > k) tail--; ret += tail - head; head++; } return ret; } void dfs(int u){ //Treedp the subtree of Root-u Qcore(u); ans += calc(core , 0); vis[core] = 1; for (int i = head[core] ; i != -1 ; i = edge[i].next){ int g = edge[i].to; if (!vis[g]){ ans -= calc(g , edge[i].len); dfs(g); } } } void solve(){ tot = 0; FLC(head , -1); REP(i , n - 1){ int u , v , w; RD(u , v , w); addedge(u , v , w); addedge(v , u , w); } ans = 0; RST(vis); dfs(1); OT(ans); } int main(){ // freopen("0.txt" , "r" , stdin); // freopen("1.txt" , "w" , stdout); while(RD(n , k) , n && k) solve(); }
相关文章推荐
- POJ 1741 Tree DP+树的点分治
- POJ 1741 Tree 树形DP(分治)
- POJ 1741 Tree 树形DP(分治)
- POJ 1741 Tree 树分治 dp
- poj1741 Tree【点分治模板】
- POJ 1741 Tree(树的点分治、树形dp、男人八题)
- POJ 1741 Tree 树分治
- poj 1741 Tree(树分治)
- POJ-1741 Tree(树分治)
- POJ 1741 Tree (树上点分治)(楼教主男人八题之一)
- Poj 1741 Tree 点分治 解题报告
- poj 1741 Tree - 树分治
- POJ 1741 Tree 树分治
- POJ 1741|BZOJ 1468|Tree|树分治
- POJ 1741 Tree | 树分治
- POJ1741 Tree (树上点分治/treap+启发式合并)
- poj 1741 Tree (树的分治)
- poj 1741 Tree(树的分治)
- POJ 1741 Tree (点分治)
- 树分治基础模板以及树的重心(poj1741 tree)