POJ 1741 Tree 树 点分治
来源:互联网 发布:倚天屠龙记结局知乎 编辑:程序博客网 时间:2024/05/16 09:09
题意:给定一颗n(n<=10000)个点的带权树,问这颗树中两点最短路小于等于K的点对有多少。
漆子超 的《分治算法在树的路径问题中的应用》中的例题之一。
因为是无根树,每次找树的重心,以重心转换为有根树,可以防止算法从
代码:
#include <iostream>#include <cstdio>#include <algorithm>#include <cstring>using namespace std;typedef long long LL;const int MAXN=10000+100;struct Edge { int to,next,w; Edge(){} Edge(int _to,int _next,int _w):to(_to),next(_next),w(_w){}}e[MAXN<<1];int head[MAXN],tot;void init(){ memset(head,-1,sizeof(head)); tot=0;}void AddEdge(int u,int v,int w){ e[tot]=Edge(v,head[u],w); head[u]=tot++; e[tot]=Edge(u,head[v],w); head[v]=tot++;}int n,K;int has[MAXN],root,siz[MAXN],ts[MAXN];void getroot(int u,int fa){ siz[u]=1; ts[u]=0; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(has[v]||v==fa)continue; getroot(v,u); siz[u]+=siz[v]; ts[u]=max(ts[u],siz[v]); } ts[u]=max(ts[u],ts[0]-siz[u]); if(ts[u]<ts[root])root=u;}int dis[MAXN],res[MAXN];void getdis(int u,int fa){ res[++res[0]]=dis[u]; siz[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(has[v]||v==fa)continue; dis[v]=dis[u]+e[i].w; getdis(v,u); siz[u]+=siz[v]; }}int calc(int u,int init){ //printf("u:%d init:%d\n",u,init); dis[u]=init;res[0]=0;getdis(u,u); sort(res+1,res+1+res[0]); //for(int i=1;i<=res[0];i++)printf("%d ",res[i]); //puts(""); int l=1,r=res[0]; int ans=0; while(l<r){ if(res[l]+res[r]<=K)ans+=r-l++; else --r; } //printf("%d\n",ans); return ans;}int Ans;void dfs(int u){ Ans+=calc(u,0); has[u]=1; for(int i=head[u];~i;i=e[i].next){ int v=e[i].to; if(has[v])continue; //printf("%d-->%d %d\n",u,v,e[i].to); Ans-=calc(v,e[i].w); root=0;ts[0]=siz[v]; getroot(v,v); //printf("root:%d\n",root); dfs(root); }}int main(){ while(~scanf("%d%d",&n,&K)){ if(n+K==0)break; init(); memset(has,0,sizeof(has)); for(int i=0,x,y,w;i<n-1;i++){ scanf("%d%d%d",&x,&y,&w); AddEdge(x,y,w); } root=0;ts[0]=n; getroot(1,1); Ans=0; //printf("root:%d\n",root); dfs(root); 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 Tree 树的点分治
- 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 1741Tree(点分治)
- Leetcode NO.274 H-Index
- andriod开发点滴(在listView上添加了一个checkbox后,点击list无响应)
- 单例(一)
- 闲来无事,学着用C#写邮箱助手、群发小工具
- C# 中栈和队的区别
- POJ 1741 Tree 树 点分治
- 中英文美国电厂热平衡类计算Thermoflow.Pro.v19.0+PLS-CADD v12.3电力软件GateCycle 6.1.1
- SCPC / ACM2015国庆培训正式赛
- DataKit CrossManager 2015.4 Win32_64 1CD
- java Exception RuntimeException
- 第一章 基础知识
- 端口状态说明 LISTENING、ESTABLISHED、TIME_WAIT及CLOSE_WAIT
- leetcode 118 Pascal's Triangle(难易度:Easy)
- 排序一:快速排序