poj 1741 Tree 树的分治
2012-03-04 21:52
423 查看
题意:给定一棵边带权的树,求多少对点之间的距离小于k
#include<iostream> #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define NMAX 10010 struct node { int num,weight; node *next; }; node *graph[NMAX]; node memo[2*NMAX]; bool use[NMAX]; int size[NMAX],d[NMAX]; int f[NMAX]; int n,m,top,tot,root; int sumsize,minsize; void add(int x,int y,int z) { node *p=&memo[top++]; p->num=y; p->weight=z; p->next=graph[x]; graph[x]=p; p=&memo[top++]; p->num=x; p->weight=z; p->next=graph[y]; graph[y]=p; } void get_root(int i,int fa) { int big=-1; size[i]=1; for(node *p=graph[i];p;p=p->next) if(!use[p->num]&&p->num!=fa) { get_root(p->num,i); size[i]+=size[p->num]; if(size[p->num]>big) big=size[p->num]; } if(sumsize-size[i]>big) big=sumsize-size[i]; if(big<minsize) minsize=big,root=i; } void get_dis(int i,int dis,int fa) { d[++tot]=dis; for(node *p=graph[i];p;p=p->next) if(!use[p->num]&&p->num!=fa) get_dis(p->num,dis+p->weight,i); } int count(int x,int dis) { int s=0; tot=0; get_dis(x,dis,-1); sort(d+1,d+tot+1); for(int i=1,j=tot;i<=j;i++) { while(d[i]+d[j]>m&&i<=j) j--; if(i<j) s+=j-i; } return s; } void dfs(int i) { sumsize=minsize=size[i]; get_root(i,-1); i=root; f[i]=count(i,0); //cout<<i<<" w "<<f[i]<<endl; use[i]=1; for(node *p=graph[i];p;p=p->next) if(!use[p->num]) { f[i]-=count(p->num,p->weight); dfs(p->num); } } int main() { int i; int x,y,z; while(scanf("%d%d",&n,&m)!=EOF&&n) { int ans=0; top=0; memset(graph,0,sizeof(graph)); memset(use,0,sizeof(use)); for(i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&z); add(x,y,z); } size[1]=n; dfs(1); for(i=1;i<=n;i++) ans+=f[i]; printf("%d\n",ans); } return 0; }
相关文章推荐
- POJ 1741 Tree (男人八题 - 树分治[点分])
- 树分治基础模板以及树的重心(poj1741 tree)
- [POJ 1741] DP + Tree 分治
- POJ 1741 Tree 树的分治
- poj 1741 Tree 树分治
- [POJ 1741] Tree (树的分治)
- poj1741 Tree (求树上任意两点之间权值和小于k的个数)(树分治)
- POJ 1741 Tree【Tree,点分治】
- poj1741-Tree(树的分治)
- POJ 1741 Tree (树上点分治)(楼教主男人八题之一)
- POJ 1741 Tree ——点分治
- POJ 1741 Tree(树的分治)
- 【POJ 1741】Tree (树上点分治)
- POJ1741--Tree(树的分治)
- poj 1741 Tree 树的点分治
- POJ - 1741 Tree 【树的点分治模板题】
- POJ 1741 Tree 点分治
- POJ 1741 Tree(树的点分治、树形dp、男人八题)
- POJ 1741 Tree【Tree,点分治】
- POJ-1741 TREE 点分治 树上问题