[BZOJ2599][IOI2011]Race 点分治

2599: [IOI2011]Race

Time Limit: 70 Sec  Memory Limit: 128 MB
Submit: 3934  Solved: 1163
[Submit][Status][Discuss]

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
考虑点分治,每次对子树进行dfs求出子树中每个点到根的距离并记在dis[i]中,步数记在b[i]中。
同时我们开一个桶tot,记录这颗子树之前的子树中所有dis中步数的最小值。
开一个v的桶记录此时tot桶中记录的数是否为以当前u为根更新的答案。
 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 using namespace std;
 7 struct data {
 8     int to,next,val;
 9 }e[400005];
10 int head[200005],cnt;
11 bool vis[200005];
12 void add(int u,int v,int val) {e[cnt].to=v;e[cnt].next=head[u];e[cnt].val=val;head[u]=cnt++;}
13 int son[200005],f[200005],root,sum;
14 int b[200005],dis[200005],tot[1000005];
15 int n,k;
16 int ans=0;
17 int num;
18 int v[1000005];
19 int tt=0;
20 void findroot(int x,int fa) {
21     son[x]=1;f[x]=0;
22     for(int i=head[x];i>=0;i=e[i].next) {
23         int to=e[i].to;if(to==fa||vis[to]) continue;
24         findroot(to,x);
25         son[x]+=son[to];
26         f[x]=max(f[x],son[to]);
27     }
28     f[x]=max(f[x],sum-son[x]);
29     if(f[x]<f[root]) root=x;
30     return;
31 }
32 void dfs(int x,int fa,int d,int dep) {
33     dis[++num]=d;b[num]=dep;
34     for(int i=head[x];i>=0;i=e[i].next) {
35         int to=e[i].to;if(to==fa||vis[to]) continue;
36         if(d+e[i].val>k) continue;
37         dfs(to,x,d+e[i].val,dep+1);
38     }
39 }
40 void work(int x) {
41     vis[x]=1;
42     bool flag=0;
43     for(int i=head[x];i>=0;i=e[i].next) {
44         num=0;
45         int to=e[i].to;if(vis[to]) continue;
46         if(e[i].val>k) continue;
47         dfs(to,x,e[i].val,1);
48         for(int j=1;j<=num;j++) if(dis[j]==k) ans=min(ans,b[j]);
49         if(flag)
50             for(int j=1;j<=num;j++) 
51                 if(dis[j]<=k&&v[k-dis[j]]==x) ans=min(ans,b[j]+tot[k-dis[j]]);
52         for(int j=1;j<=num;j++) 
53             if(dis[j]<=k) {
54                 if(v[dis[j]]!=x) v[dis[j]]=x,tot[dis[j]]=b[j];
55                 else tot[dis[j]]=min(tot[dis[j]],b[j]);
56             }
57         flag=1;
58     }
59     for(int i=head[x];i>=0;i=e[i].next) {
60         int to=e[i].to;
61         if(vis[to]) continue;
62         root=0;f[0]=n;sum=son[to];
63         findroot(to,x);
64         work(root);
65     }
66 }
67 int main() {
68     //freopen("gg.in","r",stdin);
69     memset(head,-1,sizeof(head));
70     scanf("%d%d",&n,&k);
71     for(int i=1;i<n;i++) {
72         int u,v,t;
73         scanf("%d%d%d",&u,&v,&t);
74         add(u+1,v+1,t);add(v+1,u+1,t);
75     }
76     sum=n;ans=n;f[0]=n;
77     findroot(1,0);
78     work(root);
79     if(ans==n) printf("-1");
80     else printf("%d",ans);
81 }
View Code

 

转载于:https://www.cnblogs.com/wls001/p/7756381.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/390948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分词消除歧义_角色标题消除歧义

分词消除歧义折磨数据&#xff0c;它将承认任何事情 (Torture the data, and it will confess to anything) Disambiguation as defined in the vocabulary.com dictionary refers to the removal of ambiguity by making something clear and narrowing down its meaning. Whi…

北航教授李波:说AI会有低潮就是胡扯,这是人类长期的追求

这一轮所谓人工智能的高潮&#xff0c;和以往的几次都有所不同&#xff0c;那是因为其受到了产业界的极大关注和参与。而以前并不是这样。 当今世界是一个高度信息化的世界&#xff0c;甚至我们有一只脚已经踏入了智能化时代。而在我们日常交流和信息互动中&#xff0c;迅速发…

创建字符串枚举的最好方法

问题&#xff1a;创建字符串枚举的最好方法 用一个枚举类型去表示一组字符串的最好方法是什么 我尝试这样&#xff1a; enum Strings{STRING_ONE("ONE"), STRING_TWO("TWO") }我怎么样才可以像使用字符串那样使用它们&#xff1f; 回答一 我不知道你想…

网络安全习惯_健康习惯,确保良好的网络安全

网络安全习惯In a similar fashion to everyone getting the flu now and again, the risk of catching a cyberattack is a common one. Both a sophisticated social engineering attack or grammatically-lacking email phishing scam can cause real damage. No one who c…

attr和prop的区别

由于prop(property的缩写)和attr(attribute的缩写)翻译成汉语&#xff0c;均有“特性、属性”等意思的原因&#xff0c;导致大家容易混淆分不清。 (1)在处理自定义时属性时&#xff0c;用attr()&#xff0c;若用prop(),则结果为undefined&#xff1b; (2)DOM固有属性&#xff0…

15行Python代码,帮你理解令牌桶算法

在网络中传输数据时&#xff0c;为了防止网络拥塞&#xff0c;需限制流出网络的流量&#xff0c;使流量以比较均匀的速度向外发送&#xff0c;令牌桶算法就实现了这个功能&#xff0c;可控制发送到网络上数据的数目&#xff0c;并允许突发数据的发送。 什么是令牌 从名字上看令…

在Java中,如何使一个字符串的首字母变为大写

问题&#xff1a;在Java中&#xff0c;如何使一个字符串的首字母变为大写 我使用Java去获取用户的字符串输入。我尝试使他们输入的第一个字符大写 我尝试这样: String name;BufferedReader br new InputStreamReader(System.in);String s1 name.charAt(0).toUppercase());…

在加利福尼亚州投资于新餐馆:一种数据驱动的方法

“It is difficult to make predictions, especially about the future.”“很难做出预测&#xff0c;尤其是对未来的预测。” ~Niels Bohr〜尼尔斯波尔 Everything is better interpreted through data. And data-driven decision making is crucial for success in any ind…

javascript脚本_使用脚本src属性将JavaScript链接到HTML

javascript脚本The ‘src’ attribute in a tag is the path to an external file or resource that you want to link to your HTML document.标记中的src属性是您要链接到HTML文档的外部文件或资源的路径。 For example, if you had your own custom JavaScript file named …

阿里云ESC上的Ubuntu图形界面的安装

系统装的是Ubuntu Server 16.04 64位版的图形界面&#xff0c;这里是转载的一个大神的帖子 http://blog.csdn.net/dk_0228/article/details/54571867&#xff0c; 当然自己也再记录一下&#xff0c;加深点印象 1.更新apt-get 保证最新 apt-get update 2.用putty或者Xshell连接远…

leetcode 1269. 停在原地的方案数(dp)

示例 1&#xff1a; 输入&#xff1a;steps 3, arrLen 2 输出&#xff1a;4 解释&#xff1a;3 步后&#xff0c;总共有 4 种不同的方法可以停在索引 0 处。 向右&#xff0c;向左&#xff0c;不动 不动&#xff0c;向右&#xff0c;向左 向右&#xff0c;不动&#xff0c;向…

JavaScript Onclick事件解释

The onclick event in JavaScript lets you as a programmer execute a function when an element is clicked.JavaScript中的onclick事件可让您作为程序员在单击元素时执行功能。 按钮Onclick示例 (Button Onclick Example) <button onclick"myFunction()">C…

近似算法的近似率_选择最佳近似最近算法的数据科学家指南

近似算法的近似率by Braden Riggs and George Williams (gwilliamsgsitechnology.com)Braden Riggs和George Williams(gwilliamsgsitechnology.com) Whether you are new to the field of data science or a seasoned veteran, you have likely come into contact with the te…

VMware安装CentOS之二——最小化安装CentOS

1、上文已经创建了一个虚拟机&#xff0c;现在我们点击开启虚拟机。2、虚拟机进入到安装的界面&#xff0c;在这里我们选择第一行&#xff0c;安装或者升级系统。3、这里会提示要检查光盘&#xff0c;我们直接选择跳过。4、这里会提示我的硬件设备不被支持&#xff0c;点击OK&a…

什么是GraphQL? 普通神话被揭穿。

I love talking about GraphQL, especially with people who have been working with GraphQL or thinking of adopting GraphQL. One common question people have is why someone would want to move to GraphQL from REST. 我喜欢谈论GraphQL&#xff0c;特别是和那些一直在…

在Spring Boot里面,怎么获取定义在application.properties文件里的值

问题&#xff1a;在Spring Boot里面&#xff0c;怎么获取定义在application.properties文件里的值、 我想访问application.properties里面提供的值&#xff0c;像这样&#xff1a; logging.level.org.springframework.web: DEBUG logging.level.org.hibernate: ERROR logging…

连接sqlexpress

sqlexpress在visualstudio安装时可选择安装。   数据源添加 localhost\sqlexpress window身份认证即可。转载于:https://www.cnblogs.com/zjxbetter/p/7767241.html

在Python中使用Seaborn和WordCloud可视化YouTube视频

I am an avid Youtube user and love watching videos on it in my free time. I decided to do some exploratory data analysis on the youtube videos streamed in the US. I found the dataset on the Kaggle on this link我是YouTube的狂热用户&#xff0c;喜欢在业余时间…

Win下更新pip出现OSError:[WinError17]与PerrmissionError:[WinError5]及解决

环境&#xff1a;Win7 64位&#xff0c;python3.6.0 我在准备用pip装东西的时候&#xff0c;在cmd里先更新了一下pip&#xff0c;大概是9.0.1更新到9.0. 尝试更新pip命令&#xff1a; pip install --upgrade pip 更新一半挂了 出现了 OSError:[WinError17] 与 PerrmissionError…

老生常谈:抽象工厂模式

在创建型模式中有一个模式是不得不学的,那就是抽象工厂模式(Abstract Factory),这是创建型模式中最为复杂,功能最强大的模式.它常与工厂方法组合来实现。平时我们在写一个组件的时候一般只针对一种语言,或者说是针对一个区域的人来实现。 例如:现有有一个新闻组件,在中国我们有…