[Poj1741]Tree (点分治)
2014-07-20 22:06
435 查看
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #define inf 0x7fffffff using namespace std; inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,K,cnt,sum,ans,root; int head[10001],deep[10001],d[10001],f[10001],son[10001]; bool vis[10001]; struct edge{int to,next,v;}e[20001]; inline void ins(int u,int v,int w){ e[++cnt]=(edge){v,head[u],w};head[u]=cnt; e[++cnt]=(edge){u,head[v],w};head[v]=cnt; } inline void getroot(int x,int fa){ son[x]=1;f[x]=0; for(int i=head[x];i;i=e[i].next){ if(e[i].to==fa||vis[e[i].to])continue; getroot(e[i].to,x); son[x]+=son[e[i].to]; f[x]=max(f[x],son[e[i].to]); } f[x]=max(f[x],sum-son[x]); if(f[x]<f[root])root=x; } inline void getdeep(int x,int fa){ deep[++deep[0]]=d[x]; for(int i=head[x];i;i=e[i].next){ if(e[i].to==fa||vis[e[i].to])continue; d[e[i].to]=d[x]+e[i].v; getdeep(e[i].to,x); } } inline int cal(int x,int now){ d[x]=now;deep[0]=0; getdeep(x,0); sort(deep+1,deep+deep[0]+1); int t=0,l,r; for(l=1,r=deep[0];l<r;){ if(deep[l]+deep[r]<=K)t+=r-l,l++; else r--; } return t; } inline void work(int x){ ans+=cal(x,0); vis[x]=1; for(int i=head[x];i;i=e[i].next){ if(vis[e[i].to])continue; ans-=cal(e[i].to,e[i].v); sum=son[e[i].to]; root=0; getroot(e[i].to,root); work(root); } } int main(){ while(1){ ans=root=cnt=0; memset(vis,0,sizeof(vis)); memset(head,0,sizeof(head)); n=read();K=read(); if(n==0)break; for(int i=1;i<n;++i){ int u=read(),v=read(),w=read(); ins(u,v,w); } sum=n;f[0]=inf; getroot(1,0); work(root); printf("%d\n",ans); } return 0; }
相关文章推荐
- 【poj1741】Tree 树的点分治
- [poj1741] tree [点分治]
- 【POJ1741】Tree 树分治 模板咯?
- [poj1741][tree] (树/点分治)
- 【poj1741】tree 点分治
- POJ1741 Tree(树的点分治基础题)
- [POJ1741]Tree |点分治
- [poj1741]Tree(点分治+容斥原理)
- POJ1741--Tree (树的点分治) 求树上距离小于等于k的点对数
- 【树分治】poj1741 tree
- POJ1741 [Tree] 点分治
- [平衡树+启发式合并 || 点分治] POJ1741 Tree
- 【poj1741】Tree 点分治
- 【POJ1741】Tree(点分治)
- [poj1741 Tree]树上点分治
- POJ1741 Tree(点分治模板题)
- 【POJ1741】Tree【点分治】
- poj1741 Tree(点分治)
- POJ1741 tree 【点分治】
- POJ1741 tree 【点分治】