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

HINT

2018.1.3新加数据一组,未重测

Source

很简单的一道点分治,注意一下维护的顺序,先更新答案再更新桶数组

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #define M 200010
 5 using namespace std;
 6 int n,m,num,rt,ans,k,S;
 7 int maxn[M],head[M],dis[M],d[M],size[M],t[M<<3];
 8 bool vis[M];
 9 struct point{int to,next,dis;}e[M<<1];
10 void add(int from,int to,int dis) {
11     e[++num].next=head[from];
12     e[num].to=to;
13     e[num].dis=dis;
14     head[from]=num;
15 }
16 void getroot(int x,int fa) {
17     size[x]=1;maxn[x]=0;
18     for(int i=head[x];i;i=e[i].next) {
19         int to=e[i].to;
20         if(to==fa||vis[to]) continue;
21         getroot(to,x),size[x]+=size[to];
22         maxn[x]=max(maxn[x],size[to]);
23     }
24     maxn[x]=max(maxn[x],S-size[x]);
25     if(maxn[x]<maxn[rt]) rt=x;
26 }
27 void cal(int x,int fa) {
28     if(dis[x]>k) return;
29     ans=min(ans,d[x]+t[k-dis[x]]);
30     for(int i=head[x];i;i=e[i].next) {
31         int to=e[i].to;
32         if(vis[to]||to==fa) continue;
33         d[to]=d[x]+1,dis[to]=dis[x]+e[i].dis;
34         cal(to,x);
35     }
36 }
37 void insert(int x,int fa) {
38     if(dis[x]<=k) {
39         t[dis[x]]=min(t[dis[x]],d[x]);
40         for(int i=head[x];i;i=e[i].next)
41             if(!vis[e[i].to]&&e[i].to!=fa)
42                 insert(e[i].to,x);
43     }
44 }
45 void del(int x,int fa) {
46     if(dis[x]<=k) {
47         t[dis[x]]=1e9;
48         for(int i=head[x];i;i=e[i].next)
49             if(!vis[e[i].to]&&e[i].to!=fa)
50                 del(e[i].to,x);
51     }
52 }
53 void solve(int x) {
54     vis[x]=true;t[0]=0;
55     for(int i=head[x];i;i=e[i].next) {
56         int to=e[i].to;
57         if(vis[to]) continue;
58         d[to]=1,dis[to]=e[i].dis,cal(to,0);
59         insert(to,x);
60     }
61     for(int i=head[x];i;i=e[i].next)
62         if(!vis[e[i].to])
63             del(e[i].to,x);
64     for(int i=head[x];i;i=e[i].next) {
65         int to=e[i].to;
66         if(vis[to]) continue;
67         rt=0,S=size[to],getroot(to,0);
68         solve(rt);
69     }
70 }
71 int main() {
72     scanf("%d%d",&n,&k);ans=n+1;
73     memset(t,1,sizeof(t));
74     for(int i=1;i<n;i++) {
75         int a,b,c;scanf("%d%d%d",&a,&b,&c);
76         a++,b++;
77         add(a,b,c),add(b,a,c);
78     }
79     S=maxn[0]=n;getroot(1,0);
80     solve(rt);
81     if(ans>n) puts("-1");
82     else printf("%d\n",ans);
83     return 0;
84 }

转载于:https://www.cnblogs.com/Slrslr/p/10027299.html

[BZOJ2599]Race相关推荐

  1. 2016区域赛前冲刺训练

    UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...

  2. 【BZOJ-2599】Race 点分治

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MB Submit: 2590  Solved: 769 [Submit][Stat ...

  3. [BZOJ2599][IOI2011]Race 点分治

    2599: [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MB Submit: 3934  Solved: 1163 [Submit][Sta ...

  4. Blender赛车动画制作学习教程 Learn Race Car Animation with Blender

    使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender.免费下载和免费用于任何 ...

  5. 数据竞争(data race)问题分析的利器——valgrind的Helgrind

    数据竞争(data race)是指在非线程安全的情况下,多线程对同一个地址空间进行写操作.一般来说,我们都会通过线程同步方法来保证数据的安全,比如采用互斥量或者读写锁.但是由于某些笔误或者设计的缺陷, ...

  6. java race condition_java多线程(一)Race Condition现象及产生的原因

    什么是Race Condition 首先,什么是Race Condition呢,Race Condition中文翻译是竞争条件,是指多个进程或者线程并发访问和操作同一数据且执行结果与访问发生的特定顺序 ...

  7. explicit specialization of ‘Race‘ after instantiation ,implicit instantiation first required here。

    报错1: E:\project\qt\Pokemon3\PokemonServer\pokemon.cpp:470: error: specialization of 'Race::Race() [w ...

  8. 后生可畏!中国军团称霸阅读理解竞赛RACE:微信AI称王,高中生力压腾讯康奈尔联队(附资料)...

    本文经AI新媒体量子位(公众号ID:qbitai )授权转载,转载请联系出处 本文约4000字,建议阅读5分钟. 本文为你介绍了由CMU语言技术研究所发起RACE数据集活动中,中国军团雄霸天下的情况. ...

  9. golang-exec cmd data race

    问题背景:bytes.Buffer grow panic panic: runtime error: slice bounds out of range [:1024] with capacity 5 ...

最新文章

  1. java 大臣的旅费_PREV-9-蓝桥杯-历届试题-大臣的旅费-java
  2. 体感Kinect手势识别开发基本原理
  3. 我的Windows Vista™也装好了...
  4. 《那些年啊,那些事——一个程序员的奋斗史》——86
  5. 超链接把一个值传到多个页面的方法
  6. MySQL简明教程-下
  7. Visio Professional详细教程(一)
  8. matlab按图像边缘抠图_不会抠图?保姆级抠图教程!手把手教你抠图(二)
  9. 微软王码五笔98版 v5.2 下载
  10. android模拟器快捷键,Android模拟器快捷键大全
  11. 虚拟服务器跟目录,如何找虚拟主机根目录?
  12. phpstorm 配置 Xdebug 调试
  13. 查询结果按照字母顺序排序
  14. MATLAB 图像嵌入水印图像程序
  15. 测试架构需要具备哪些能力
  16. 【华人学者风采】马帅 北京航空航天大学
  17. Sping IOC 理解(转)
  18. 每日一题 笨拙的手指
  19. SpringBoot初始化过程核心源码剖析
  20. 在跑SC-LEGO-LOAM时报错[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloude

热门文章

  1. Android ExpandableListView几个特殊的属性
  2. java连接mysql数据库jdbc
  3. Python操作Excel表格
  4. 使用CXF 2.7.5出现的java.lang.RuntimeException: Cannot create a secure XMLInputFactory错误解决...
  5. centos中使用python遇到的几个问题
  6. 当Linux提权不能反弹Shell时利用metasploit进行提权
  7. FLASH开发[02]
  8. Mapper动态代理开发所要遵循的四个原则
  9. Java selenium操作下拉滚动条的几种方法
  10. 研诺首款D类音频放大器延长便携应用中的电池寿命