POJ1655 【树的分治】
来源:互联网 发布:体检报告单软件 编辑:程序博客网 时间:2024/05/17 04:07
楼教主的题。
//每次选择树的重心,删去重心形成多棵子树(子树一定小于上一层的一半),最多log(n)层 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N=22222; int ev[N],ew[N],nxt[N],head[N],e; int vis[N],dp[N],arr[N]; int n,k,core,sz,pmn,ed; void init() { memset(head,-1,sizeof(head)); memset(vis,0,sizeof(vis)); e=ed=0; } void add(int u,int v,int w) { ev[e]=v,ew[e]=w,nxt[e]=head[u];head[u]=e++; } void calsz(int u,int p)//辅助求重心 { for(int i=head[u];~i;i=nxt[i]) if(ev[i]!=p&&!vis[ev[i]]) calsz(ev[i],u),sz++; } void calcore(int u,int p)//求重心 { dp[u]=1;int mx=0,v; for(int i=head[u];~i;i=nxt[i]) if(ev[i]!=p&&!vis[v=ev[i]]) { calcore(v,u); dp[u]+=dp[v]; mx=max(mx,dp[v]); } mx=max(mx,sz-dp[u]); if(mx<pmn) pmn=mx,core=u; } int cntnum(int *arr,int len)//arr[0]-arr[len-1]满足条件的点对数 { int ans=0; sort(arr,arr+len); for(int i=0,j=len-1;i<j;i++) { while(i<j&&arr[i]+arr[j]>k) j--; ans+=j-i; } return ans; } void make(int u,int p,int len)//将子树所有结点到当前根的距离放入arr数组中 { arr[ed++]=len; for(int i=head[u];~i;i=nxt[i]) if(ev[i]!=p&&!vis[ev[i]]) make(ev[i],u,len+ew[i]); } int dfs(int u) { pmn=1e8; sz=1; calsz(u,u); calcore(u,u); ed=vis[u=core]=1; int ans=0; for(int i=head[u];~i;i=nxt[i]) { int st=ed; if(!vis[ev[i]]) make(ev[i],u,ew[i]); ans-=cntnum(arr+st,ed-st);//先将下一层子树内部满足条件的点对减掉 } ans+=cntnum(arr,ed); for(int i=head[u];~i;i=nxt[i]) if(!vis[ev[i]]) ans+=dfs(ev[i]);//统计当前子树点对 return ans; } int main() { while(scanf("%d%d",&n,&k),n||k) { init(); for(int i=1; i<n; i++) { int u,v,w; scanf("%d%d%d",&u,&v,&w); add(u,v,w),add(v,u,w); } printf("%d\n",dfs(1)); } return 0; }
- POJ1655 【树的分治】
- poj1655树的重心
- poj1655(树的重心)
- 【POJ1655&&3107】树的重心——点分治的准备
- poj1655(树的重心)
- poj1655 求树的重心
- 树形dp求树的重心 poj1655
- 求树的重心(POJ1655)
- 【poj1655】【poj3107】【求树的重心】
- poj1655解题报告(树的质心)
- POJ1655 Balancing Act (树的重心)
- POJ1655 Balancing Act 求树的重心
- 【poj1655】Balancing Act 求树的重心
- 【POJ1655】Balancing Act【树的重心】
- 树的重心POJ1655 Balancing Act
- poj1655—Balancing Act(树的重心)
- [POJ1655]Balancing Act(树的重心)
- poj1655 Balancing Act(树的重心[模板])
- 服务器端世界时间(UTC)转换客户端时区时间
- 细谈C语言中的strcpy,strncpy,memcpy,memmove,memset函数 .
- ICMP诊断报文类型
- C语言的编译过程 .
- mysql 基本操作命令
- POJ1655 【树的分治】
- 开博
- 比较带参宏与函数的异同 .
- BNUOJ 12884 kruskal+ext_lca
- C++数组--详细分析 .
- u-boot2010.03 移植篇(三)-----修正配置文件.解决内存大小显示问题,真的没什么可看的
- sql2005分区表
- Mac Mountain Lion Failed to load JavaHL Library.
- 各种内排序算法的C++实现