poj 1741 Tree 树上的分治
来源:互联网 发布:网络侦查学专业代码 编辑:程序博客网 时间:2024/05/29 18:35
http://poj.org/problem?id=1741
算法:
寻找树的重心;
分治;
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 10010;int n , m , k;int size[maxn] , mx[maxn] , mi , dis[maxn] , center , cnt , ans;bool vis[maxn];struct Edge {int v , w , next;Edge() {}Edge(int v,int w,int next) : v(v) , w(w) , next(next) {};}edge[maxn<<1];int E , head[maxn];void init() {E = 0;memset(head,-1,sizeof(int)*(n+1));}void addedge(int u,int v,int w) {edge[E] = Edge(v,w,head[u]); head[u] = E++;edge[E] = Edge(u,w,head[v]); head[v] = E++;}void dfssize(int u,int fa) {size[u] = 1;mx[u] = 0;for(int i=head[u];i!=-1;i=edge[i].next) {int v = edge[i].v;if(vis[v] || v == fa) continue;dfssize(v , u);size[u] += size[v];if(size[v] > mx[u]) mx[u] = size[v];}return;}void dfscenter(int r,int u,int fa) {int tmp = max(mx[u] , size[r]-size[u]);if(tmp < mi) mi = tmp , center = u;for(int i=head[u];i!=-1;i=edge[i].next) {int v = edge[i].v;if(vis[v] || v == fa) continue;dfscenter(r,v,u);}return;}void dfsdis(int u,int d,int fa) {dis[cnt++] = d;for(int i=head[u];i!=-1;i=edge[i].next) {int v = edge[i].v;if(vis[v] || v == fa) continue;dfsdis(v,d+edge[i].w,u);}return;}int calc(int u,int d) {int ret = 0;cnt = 0;dfsdis(u,d,-1);sort(dis,dis+cnt);int i = 0 , j = cnt - 1;while(i < j) {while(i<j & dis[i]+dis[j]>k) j--;ret += j-i;i++;}return ret;}void dfs(int u) {mi = n;dfssize(u,-1);dfscenter(u,u,-1);ans += calc(center,0);vis[center] = true;for(int i=head[center];i!=-1;i=edge[i].next) {int v = edge[i].v;if(vis[v]) continue;ans -= calc(v,edge[i].w);dfs(v);}}int main() {while(~scanf("%d%d" , &n,&k) && n+k) {init();memset(vis,false,sizeof(bool)*(n+1));ans = 0;for(int i=1;i<n;i++) {int u ,v , w;scanf("%d%d%d" ,&u,&v,&w);addedge(u,v,w);}dfs(1);printf("%d\n" , ans);}return 0;}
0 0
- poj 1741 Tree 树上的分治
- POJ 1741 Tree(树上的点分治)
- POJ 1741 Tree 树上分治
- poj 1741 Tree 树上的分治+求树的重心
- POJ 1741 Tree [树上点分治]
- [poj 1741] Tree 树上点分治
- 【POJ 1741】Tree (树上点分治)
- POJ-1741 TREE 点分治 树上问题
- POJ 1741 树上 点的 分治
- 【点分治】【POJ 1741】【cogs 1714】树上的点对
- POJ 1741 Tree (树上点分治)(楼教主男人八题之一)
- POJ - 1987 Distance Statistics 树上的分治
- POJ 1741 Tree 树的分治
- poj 1741 Tree 树的分治
- poj 1741 Tree (点的分治)
- poj 1741 Tree(树的分治)
- POJ 1741 Tree 树的点分治
- poj 1741 Tree 树的分治
- cocos2d-x 3.0 利用python脚本在目录Classes内创建class
- android 锁屏软件的软件的开机自启动
- STM32启动文件详解
- Neutron亟需断骨换筋
- 同事GITHUB上写的LISTVIEW下拉回弹 上拉HEADVIEW放大
- poj 1741 Tree 树上的分治
- 关于Windows Touch
- Mac os x如何使用Ports安装gstreamer开发环境
- 黑马程序员------张孝祥老师视频笔记------高新技术
- 使用windows live writer离线写csdn博客
- jQuery基础
- Javascript: 当点击submit提交按钮时将文本框中的信息添加到下面得表单中
- js中的<!-- -->有什么作用
- 北大poj-1002题-487-3279