当前位置: 首页 > news >正文

BZOJ2599:[IOI2011]Race(点分治)

Description

给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000

Input

第一行 两个整数 n, k
第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始)

Output

一个整数 表示最小边数量 如果不存在这样的路径 输出-1

Sample Input

4 3
0 1 1
1 2 2
1 3 4

Sample Output

2

Solution

开一个100W的数组t,t[i]表示到当前处理的树的根距离为i的最小边数
对于点x,我们要统计经过x的路径的话
就分别统计x的每颗子树,在统计一颗子树的时候用t[i]更新答案
并在每统计完一颗子树后更新t数组
↑这样是为了防止统计答案的时候两个点在同一子树里

Code

  1 #include<iostream>
  2 #include<cstring>
  3 #include<cstdio>
  4 #define N (200000+100)
  5 using namespace std;
  6 struct node
  7 {
  8     int to,next,len;
  9 }edge[N*2];
 10 int n,k,sum,root,ans,INF;
 11 int head[N],num_edge;
 12 int depth[N],d[N],size[N],maxn[N];
 13 int dis[N],t[N*5];
 14 bool vis[N];
 15 
 16 void add(int u,int v,int l)
 17 {
 18     edge[++num_edge].to=v;
 19     edge[num_edge].len=l;
 20     edge[num_edge].next=head[u];
 21     head[u]=num_edge;
 22 }
 23 
 24 void Get_root(int x,int fa)
 25 {
 26     size[x]=1; maxn[x]=0;
 27     for (int i=head[x];i!=0;i=edge[i].next)
 28         if (edge[i].to!=fa && !vis[edge[i].to])
 29         {
 30             Get_root(edge[i].to,x);
 31             size[x]+=size[edge[i].to];
 32             maxn[x]=max(maxn[x],size[edge[i].to]);
 33         }
 34     maxn[x]=max(maxn[x],sum-size[x]);
 35     if (maxn[x]<maxn[root]) root=x;
 36 }
 37 
 38 void Calc(int x,int fa)
 39 {
 40     if (dis[x]<=k) ans=min(ans,depth[x]+t[k-dis[x]]);
 41     for (int i=head[x];i!=0;i=edge[i].next)
 42         if (!vis[edge[i].to] && edge[i].to!=fa)
 43         {
 44             dis[edge[i].to]=dis[x]+edge[i].len;
 45             depth[edge[i].to]=depth[x]+1;
 46             Calc(edge[i].to,x);
 47         }
 48 }
 49 
 50 void Reset(int x,int fa,int flag)
 51 {
 52     if (dis[x]<=k)
 53     {
 54         if (flag) t[dis[x]]=min(t[dis[x]],depth[x]);
 55         else t[dis[x]]=INF;
 56     }
 57     for (int i=head[x];i!=0;i=edge[i].next)
 58         if (edge[i].to!=fa && !vis[edge[i].to])
 59             Reset(edge[i].to,x,flag);
 60 }
 61 
 62 void Solve(int x)
 63 {
 64     vis[x]=true; t[0]=0;
 65     for (int i=head[x];i!=0;i=edge[i].next)
 66         if (!vis[edge[i].to])
 67         {
 68             depth[edge[i].to]=1;
 69             dis[edge[i].to]=edge[i].len;
 70             Calc(edge[i].to,0);
 71             Reset(edge[i].to,0,1);
 72         }
 73     for (int i=head[x];i!=0;i=edge[i].next) 
 74         if (!vis[edge[i].to])
 75             Reset(edge[i].to,0,0);
 76     for (int i=head[x];i!=0;i=edge[i].next)
 77         if (!vis[edge[i].to])
 78         {
 79             sum=size[edge[i].to];
 80             root=0;
 81             Get_root(edge[i].to,0);
 82             Solve(root);
 83         }
 84     
 85 }
 86 
 87 int main()
 88 {
 89     int u,v,l;
 90     memset(t,0x3f,sizeof(t));
 91     memset(&INF,0x3f,sizeof(INF));
 92     scanf("%d%d",&n,&k);
 93     for (int i=1;i<=n-1;++i)
 94     {
 95         scanf("%d%d%d",&u,&v,&l);
 96         u++; v++;
 97         add(u,v,l); add(v,u,l);
 98     }
 99     ans=sum=maxn[0]=n;
100     Get_root(1,0);
101     Solve(root);
102     printf("%d",ans==n?-1:ans);
103 }

转载于:https://www.cnblogs.com/refun/p/8684117.html

相关文章:

  • 泛型就这么简单
  • React Native模块加载与原理分析
  • Git 与each
  • .Net Core和.Net Standard直观理解
  • Webpack 4x 之路 ( 四 )
  • 解决centos7 docker1.9 没有配置文件
  • 使用原型模式来处理用户抽奖的银两明细
  • 云计算的三种服务模式:IaaS,PaaS和SaaS
  • 你不可错过的前端面试题(一)
  • 关于同时Python3和Python2引起的问题,Fabric-samples的balance-transfer不能运行
  • React 深入系列2:组件分类
  • 深信服防火墙设备故障机的更换方法
  • [日常] Go语言圣经--作用域,基础数据类型,整型
  • Elasticsearch 父子关系维护和检索案例分享
  • Wamp集成环境 添加PHP的新版本
  • [ JavaScript ] 数据结构与算法 —— 链表
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 【笔记】你不知道的JS读书笔记——Promise
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • axios 和 cookie 的那些事
  • Flannel解读
  • Hibernate【inverse和cascade属性】知识要点
  • pdf文件如何在线转换为jpg图片
  • Python语法速览与机器学习开发环境搭建
  • SOFAMosn配置模型
  • TypeScript迭代器
  • 百度贴吧爬虫node+vue baidu_tieba_crawler
  • 警报:线上事故之CountDownLatch的威力
  • 前端知识点整理(待续)
  • 巧用 TypeScript (一)
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 数组大概知多少
  • 听说你叫Java(二)–Servlet请求
  • 小试R空间处理新库sf
  • 学习ES6 变量的解构赋值
  • 昨天1024程序员节,我故意写了个死循环~
  • ​【已解决】npm install​卡主不动的情况
  • ​LeetCode解法汇总1410. HTML 实体解析器
  • ​Python 3 新特性:类型注解
  • ​批处理文件中的errorlevel用法
  • ###C语言程序设计-----C语言学习(6)#
  • #pragma data_seg 共享数据区(转)
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • $con= MySQL有关填空题_2015年计算机二级考试《MySQL》提高练习题(10)
  • (Matalb分类预测)GA-BP遗传算法优化BP神经网络的多维分类预测
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (算法)Travel Information Center
  • .NET Core 控制台程序读 appsettings.json 、注依赖、配日志、设 IOptions
  • .NET Core工程编译事件$(TargetDir)变量为空引发的思考
  • .NET中使用Protobuffer 实现序列化和反序列化
  • /dev/sda2 is mounted; will not make a filesystem here!
  • :not(:first-child)和:not(:last-child)的用法
  • @TableId注解详细介绍 mybaits 实体类主键注解
  • [ Linux 长征路第五篇 ] make/Makefile Linux项目自动化创建工具