题目链接:https://ac.nowcoder.com/acm/contest/1099/I

点分治,计算路径数的时候,先将每个点到根的距离模2019,计算的时候就可以O(n)求出数目,对于模2019之后为0的进行特殊处理。

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 100005
#define inf 0x3f3f3f3f
int n,k,cnt,root,ans,maxx,head[maxn],size[maxn],son[maxn],vis[maxn],num[maxn];
struct edge{
int to,next,val;
}e[maxn];
vector<int>dis;
void add(int u,int v,int val)
{
e[++cnt].to=v;
e[cnt].next=head[u];
e[cnt].val=val;
head[u]=cnt;
}
void dfs_size(int u,int fa)//求各点子树大小
{
size[u]=;son[u]=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa&&!vis[v])
{
dfs_size(v,u);
size[u]+=size[v];
son[u]=max(son[u],size[v]);
}
}
}
void dfs_root(int N,int u,int fa)//求重心
{
son[u]=max(son[u],N-size[u]);
if(maxx>son[u])
{
root=u;
maxx=son[u];
}
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa&&!vis[v])
dfs_root(N,v,u);
}
}
void dfs_dis(int u,int fa,int val)//求出所有点到根的距离
{
val%=;
num[val]++;
//dis.push_back(val);
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].to;
if(v!=fa&&!vis[v])
dfs_dis(v,u,val+e[i].val);
}
}
int cal(int u,int val)//计算小于等于k的路径数
{
for(int i=;i<=;i++)
num[i]=;
//dis.clear();
dfs_dis(u,,val);
//sort(dis.begin(),dis.end());
int l=,r=dis.size()-,ret=;
for(int i=;i<;i++)//two-pointer
{
if(num[i]&&num[-i])ret+=num[i]*num[-i];
}
ret/=;
ret+=num[]*(num[]-)/;
return ret;
}
void dfs(int u)
{
dfs_size(u,);
maxx=inf;
dfs_root(size[u],u,);
ans+=cal(root,);//此时算出的路径数是包括没经过这个根的路径数,后面需要减去这种的路径数
vis[root]=;//将选的roo又被遍历t标记,防止其在之后的分治过程中
for(int i=head[root];i;i=e[i].next)
{
int v=e[i].to,val=e[i].val;
if(!vis[v])
{
ans-=cal(v,val);//子树所有边加上dis(u,v)后满足的路径数就是需要减去的路径数
dfs(v);//递归分治
}
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
int u,v,val;
for(int i=;i<=n;i++)
head[i]=vis[i]=;
cnt=ans=;
for(int i=;i<n;i++)
{
scanf("%d%d%d",&u,&v,&val);
add(u,v,val);
add(v,u,val);
}
dfs();
printf("%d\n",ans);
}
return ;
}

最新文章

  1. html5,表单的综合案例
  2. hdu 5098 双队列拓扑排序
  3. Visual Studio .NET项目转换器(ProjectConverter)修改
  4. jQuery类级别插件--返回顶部,底部,去到任何部位
  5. uvision4 ide已停止工作
  6. Oracle 基本命令
  7. java 接口与实现
  8. 杨晨露 Java 第一周总结
  9. Angular4--提速--提升Angular项目的首页打开速度(包含微信登录优化)
  10. 《k8s-1.13版本源码分析》- 调度器设计
  11. Android Jetpack之AppCompat(一)
  12. simulink创建简单模型
  13. bootstrap浅谈
  14. 解决远程连接mysql很慢的方法(网络正常)
  15. 一道PHP题引出的“短路求值”
  16. wordpress学习三:wordpress自带的模板学习
  17. JAVAWEB开发之HttpServletResponse和HttpServletRequest详解(下)(各种乱码、验证码、重定向和转发)
  18. ASP.NET MVC3控制器传递匿名对象到视图实例
  19. Lucky Conversion(找规律)
  20. Django--static静态文件引用

热门文章

  1. Laravel Form-builder使用
  2. Vue 小实例 跑马灯效果
  3. P1040 快速幂取模
  4. Linux 内核设备注册
  5. substring和substr的区别和使用
  6. [POJ2528]Mayor&#39;s posters(离散化+线段树)
  7. P3803 FFT求多项式系数
  8. [Python之路] 内存管理&amp;垃圾回收
  9. VRChat模型制作及上传总篇(201912)
  10. 面试必问之 ConcurrentHashMap 线程安全的具体实现方式