洛谷 P4178 Tree
#include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define rg register
#define _ 40010
using namespace std;
int n,record[_],num_of_edges,size[_],dfn[_],dfns,F[_],root,dis[_];//size[]不多说,F[]是i点儿子中最大子树大小
bool passed[_];
int stack[_],top,ans,k;
struct pp
{
int next,to,w;
}edge[_<<];
inline int read()
{
rg int save=,w=;rg char q=getchar();
while(q<''||q>''){if(q=='-')w=-;q=getchar();}
while(q>=''&&q<='')save=(save<<)+(save<<)+q-'',q=getchar();
return save*w;
}
void getroot(rg int i,rg int fa,rg int s)
{
size[i]=,F[i]=,dfn[i]=++dfns;
for(rg int j=record[i];j;j=edge[j].next)
{
rg int to=edge[j].to;
if(to!=fa&&!passed[to])
{
getroot(to,i,s);
F[i]=max(F[i],size[to]);
size[i]+=size[to];
}
}
F[i]=max(F[i],s-size[i]);
root=F[i]<F[root]?i:root;
}
void comput(rg int i,rg int dad)
{
stack[++top]=dis[i];//stack直接把边权记下来,无需记点
for(rg int j=record[i];j;j=edge[j].next)
{
rg int to=edge[j].to;
if((!passed[to])&&dad!=to)
{
dis[to]=dis[i]+edge[j].w;
comput(to,i);
}
}
}
inline int doit(rg int i,rg int d)//数出 该联通块中若使所有路径强制经过重心,<=k的有多少 (d为初始距离(去重用))
{
top=;dis[i]=d;
comput(i,);//计算各点到该重心的路径长
sort(stack+,stack+top+);
rg int l=,r=top,result=;
while(l<r)
if(stack[l]+stack[r]<=k)result+=r-l,l++;
else r--;
return result;
}
void dfs(rg int i,rg int all)
{
ans+=doit(i,);
passed[i]=;
for(rg int j=record[i];j;j=edge[j].next)
{
rg int to=edge[j].to;
if(!passed[to])
{
rg int s;
/* ☆☆☆*/ ans-=doit(to,edge[j].w);//去掉那些 在to的子树加上了[i->to的边权]被算作i的贡献的路径(这些路径本不存在)
if(dfn[i]<dfn[to])s=size[to];
else s=all-size[i];
root=;dfns=;
getroot(to,i,s);
// printf("%d\n",root);
dfs(to,s);
}
}
}
inline void add(rg int from,rg int to,rg int ww)
{
edge[++num_of_edges]=(pp){record[from],to,ww};
record[from]=num_of_edges;
}
int main()
{
n=read();
// cout<<"___\n"<<n<<endl;
rg int i,j;
for(i=;i<n;++i)
{
rg int x=read(),y=read(),ww=read();
add(x,y,ww),add(y,x,ww);
// cout<<x<<' '<<y<<' '<<ww<<endl;
}
k=read();
// cout<<k<<endl;
root=;F[]=n;//操作 "root=F[i]<F[root]?i:root" 需要
getroot(,,n);
dfs(root,n);
printf("%d\n",ans);
return ;
}
洛谷 P4178 Tree的更多相关文章
- 点分治模板(洛谷P4178 Tree)(树分治,树的重心,容斥原理)
推荐YCB的总结 推荐你谷ysn等巨佬的详细题解 大致流程-- dfs求出当前树的重心 对当前树内经过重心的路径统计答案(一条路径由两条由重心到其它点的子路径合并而成) 容斥减去不合法情况(两条子路径 ...
- POJ1471 Tree/洛谷P4178 Tree
Tree P4178 Tree 点分治板子. 点分治就是直接找树的重心进行暴力计算,每次树的深度不会超过子树深度的\(\frac{1}{2}\),计算完就消除影响,找下一个重心. 所以伪代码: voi ...
- 洛谷P4178 Tree (点分治)
题目描述 给你一棵TREE,以及这棵树上边的距离.问有多少对点它们两者间的距离小于等于K 输入输出格式 输入格式: N(n<=40000) 接下来n-1行边描述管道,按照题目中写的输入 接下 ...
- 洛谷 P4178 Tree —— 点分治
题目:https://www.luogu.org/problemnew/show/P4178 这道题要把 dep( dis? ) 加入一个 tmp 数组里,排序,计算点对,复杂度很美: 没有写 sor ...
- 洛谷P4178 Tree (算竞进阶习题)
点分治 还是一道点分治,和前面那道题不同的是求所有距离小于等于k的点对. 如果只是等于k,我们可以把重心的每个子树分开处理,统计之后再合并,这样可以避免答案重复(也就是再同一个子树中出现路径之和为k的 ...
- 2018.07.20 洛谷P4178 Tree(点分治)
传送门 又一道点分治. 直接维护子树内到根的所有路径长度,然后排序+双指针统计答案. 代码如下: #include<bits/stdc++.h> #define N 40005 using ...
- [洛谷P4178]Tree
题目大意:给一棵树,问有多少条路径长度小于等于$k$ 题解:点分治 卡点:无 C++ Code: #include <cstdio> #include <algorithm> ...
- [洛谷P4178] Tree (点分治模板)
题目略了吧,就是一棵树上有多少个点对之间的距离 \(\leq k\) \(n \leq 40000\) 算法 首先有一个 \(O(n^2)\) 的做法,枚举每一个点为起点,\(dfs\) 一遍可知其它 ...
- POJ 1741.Tree and 洛谷 P4178 Tree-树分治(点分治,容斥版) +二分 模板题-区间点对最短距离<=K的点对数量
POJ 1741. Tree Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 34141 Accepted: 11420 ...
随机推荐
- apache基础,apache环境搭建,apache的3种使用方式(IP、端口、域名)
一台服务器上多个网站同时运行,基于域名访问,IP访问,端口访问. http服务使用的端口是80 HTTPS使用的是443 协议名称://机器地址:端口号/路径名/文件名 协议名称—— 所使用的访问协议 ...
- [fw]error: aggregate value used where an integer was expected
一個自訂struct型態的變數,若想要轉換為unsigned,直接使用cast,gcc(version 4.4.3)編譯會回報錯誤. 例如: struct _test { unsigned hour ...
- HDU 6464 /// 权值线段树
题目大意: 共Q次操作 操作有两种 操作一 在序列尾部加入f[i]个s[i] 操作二 查询序列第f[i]小到第s[i]小之间的总和 离线操作 把序列内的值离散化 然后利用离散化后的值 在线段树上对应权 ...
- Neo4j查询节点间最短路径
Neo4j最短路径问题 1.指定某一结点 无向边: MATCH (p1:Person {name:"aaaaaaa"}),(p2:Person{name:"bbbbbb& ...
- JS异步加载,JQ事件不被执行解决方法
一,在我们实现动态生成HTML代码时会出现,使用JQ方法会不被执行,解决方法,如下:使用jquery的委托事件,将该方法委托到页面已经存在的一个节点上 <!DOCTYPE html> &l ...
- VMware Converter Standalone迁移概要
VMware Converter 迁移工具使用:1.基本概念 1.1基本组件: converter standalone server:包含server和worker两个服务,这两个服务经常一起安装 ...
- Win7装VS2015报错"安装包丢失或损坏"的解决办法
在Win7上安装VS2015的过程中,可能会出现下图错误: 这种情况,多半是应为Win7里面缺少了两个证书: Microsoft Root Certificate Authority 2010 Mic ...
- Foobar 2000增加APE播放支持的方法
这里说明一下APE,它是一种常用的无损音乐的存储格式,通常会有将原始音乐光盘数字化后存储的APE文件搭配一个CUE文件使用.这个APE存储了音乐的原始数据,而CUE文件则是一个索引文件,用来标记音乐光 ...
- OC学习篇之---@class关键字的作用以及#include和#import的区别
前一篇文章说到了OC中类的三大特性:http://blog.csdn.net/jiangwei0910410003/article/details/41707161今天我们来看一下在学习OC的过程中遇 ...
- CJE-Jenkins认证工程师考试预约报名流程
先决条件 考试费用150美元,需要由master/visr信用卡支付 考试全英文 哈哈哈 考试目的 通过各种渠道能够找到Jenkins的学习资料,并能够完成jenkins的配置管理,还是想全面的系统 ...