题目描述

给一棵树,每条边有权。求一条简单路径,权值和等于 KKK ,且边的数量最小。
输入输出格式
输入格式:

第一行:两个整数 n,kn,kn,k 。

第二至 nnn 行:每行三个整数,表示一条无向边的两端和权值 (注意点的编号从 000 开始)。

输出格式:

一个整数,表示最小边数量。

如果不存在这样的路径,输出 −1-1−1 。

输入输出样例
输入样例#1: 复制

4 3
0 1 1
1 2 2
1 3 4

输出样例#1: 复制

2

说明

n≤200000,K≤1000000n\le 200000,K\le 1000000n≤200000,K≤1000000 。

解题思路

点分治。用一个叫f的桶来维护,时间复杂度O(nlogn)

代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue> using namespace std;
const int MAXN = ;
const int inf = 0x3f3f3f3f; inline int rd(){
int x=,f=;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-;ch=getchar();}
while(isdigit(ch)) {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} int n,k,ans=0x3f3f3f3f;
int head[MAXN],cnt,sum,mx,rt,siz[MAXN];
int to[MAXN<<],nxt[MAXN<<],val[MAXN<<];
int f[],stk[MAXN],top;
bool vis[MAXN];
queue<int> Q,q; inline void add(int bg,int ed,int w){
to[++cnt]=ed,val[cnt]=w,nxt[cnt]=head[bg],head[bg]=cnt;
} inline void dfs(int x,int fa){
siz[x]=;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(vis[u] || u==fa) continue;
dfs(u,x);siz[x]+=siz[u];
}
} inline void getrt(int x,int fa){
int k=;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(vis[u] || u==fa) continue;
getrt(u,x);k=max(k,siz[u]);
}
k=max(k,sum-siz[x]);
if(k<mx) {mx=k;rt=x;}
} inline void getdis(int x,int fa,int dis,int len){
if(dis==k && len<ans) ans=len;
if(dis<k) if(f[k-dis]) ans=min(ans,f[k-dis]+len);
Q.push(dis);q.push(len);if(dis<k) stk[++top]=dis;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i]; if(vis[u] || u==fa) continue;
getdis(u,x,dis+val[i],len+);
}
} inline void getans(int x){
vis[x]=;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(vis[u]) continue;
getdis(u,x,val[i],);
while(!Q.empty()){
int now=Q.front();Q.pop();
int len=q.front();q.pop();
if(now>k) continue;
if(!f[now]) f[now]=len;
else f[now]=min(f[now],len);
}
}
for(register int i=;i<=top;i++) f[stk[i]]=;top=;
for(register int i=head[x];i;i=nxt[i]){
int u=to[i];if(vis[u]) continue;
dfs(u,x);sum=mx=siz[u];rt=;getrt(u,x);
// cout<<u<<" "<<rt<<endl;
getans(rt);
}
} int main(){
n=rd();k=rd();
for(register int i=;i<n;i++){
int x=rd()+,y=rd()+,z=rd();
add(x,y,z);add(y,x,z);
}sum=n;mx=sum;dfs(,);getrt(,);
// cout<<1<<" "<<rt<<" ";
getans(rt);
if(ans==inf) ans=-;
cout<<ans<<endl;
return ;
}
 

LUOGU P4149 [IOI2011]Race的更多相关文章

  1. 模板—点分治B(合并子树)(洛谷P4149 [IOI2011]Race)

    洛谷P4149 [IOI2011]Race 点分治作用(目前只知道这个): 求一棵树上满足条件的节点二元组(u,v)个数,比较典型的是求dis(u,v)(dis表示距离)满足条件的(u,v)个数. 算 ...

  2. P4149 [IOI2011]Race

    对于这道题,明显是点分治,权值等于k,可以用桶统计树上路径(但注意要清空); 对于每颗子树,先与之前的子树拼k,再更新桶,维护t["len"]最小边数; #include < ...

  3. 洛谷P4149 [IOI2011]Race(点分治)

    题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK ,且边的数量最小. 输入输出格式 输入格式:   第一行:两个整数 n,kn,k . 第二至 nn 行:每行三个整数,表示一条无向边的 ...

  4. [洛谷P4149][IOI2011]Race

    题目大意:给一棵树,每条边有边权.求一条简单路径,权值和等于$K$,且边的数量最小. 题解:点分治,考虑到这是最小值,不满足可减性,于是点分中的更新答案的地方计算重复的部分要做更改,就用一个数组记录前 ...

  5. [LUOGU] 4149 [IOI2011]Race

    点分治裸题 #include<iostream> #include<cstring> #include<cstdio> using namespace std; i ...

  6. P4149 [IOI2011]Race 点分治

    思路: 点分治 提交:5次 题解: 刚开始用排序+双指针写的,但是调了一晚上,总是有两个点过不了,第二天发现原因是排序时的\(cmp\)函数写错了:如果对于路径长度相同的,我们从小往大按边数排序,当双 ...

  7. 洛谷$P4149\ [IOI2011]\ Race$ 点分治

    正解:点分治 解题报告: 传送门$QwQ$ 昂先不考虑关于那个长度的限制考虑怎么做? 就开个桶,记录所有边的取值,每次加入边的时候查下是否可行就成$QwQ$ 然后现在考虑加入这个长度的限制?就考虑把这 ...

  8. 洛谷 P4149 [IOI2011]Race-树分治(点分治,不容斥版)+读入挂-树上求一条路径,权值和等于 K,且边的数量最小

    P4149 [IOI2011]Race 题目描述 给一棵树,每条边有权.求一条简单路径,权值和等于 KK,且边的数量最小. 输入格式 第一行包含两个整数 n, Kn,K. 接下来 n - 1n−1 行 ...

  9. BZOJ 2599: [IOI2011]Race( 点分治 )

    数据范围是N:20w, K100w. 点分治, 我们只需考虑经过当前树根的方案. K最大只有100w, 直接开个数组CNT[x]表示与当前树根距离为x的最少边数, 然后就可以对根的子树依次dfs并更新 ...

随机推荐

  1. 笔记:使用Python解析JSON

    使用Python解析JSON json是一种轻量级的数据交换格式,易于阅读和编写. json函数具体作用描述 函数 具体描述作用 json.dumps 将python对象编码为JSON字符串 json ...

  2. python Mean Squared Error vs. Structural Similarity Measure两种算法的图片比较

    # by movie on 2019/12/18 import matplotlib.pyplot as plt import numpy as np from skimage import meas ...

  3. DRF 序列化组件单增

    目录 自定义序列化(矬) Serializer类(方式繁琐) 底层序列化类 UserSerializer 视图序列化步骤 底层反序列化类 UserCreatSerializer 视图反序列化步骤 Mo ...

  4. H5在部分苹果手机IOS系统下重力感应无效

    原因不明,反正在IOS系统12.2以上的普通的H5移动端网页的重力感应功能无反应 解决方法: 把链接改为HTTPS,经过测试,12.2系统以上的如果你的链接是HTTP的,重力感应在网页上是没调起的,改 ...

  5. Vue生命周期的执行过程(面试必备) 极简版

    最近准备面试,临时抱佛脚的来回顾一下vue相关的面试题,当然这是不对的,平时还是要努力呀,走起: 1.创建vue实例,Vue(); 2.在创建Vue实例的时候,执行了init(),在init过程中首先 ...

  6. 转载:python操作excel表格(xlrd/xlwt)

    python操作excel表格(xlrd/xlwt)   最近遇到一个情景,就是定期生成并发送服务器使用情况报表,按照不同维度统计,涉及python对excel的操作,上网搜罗了一番,大多大同小异,而 ...

  7. NEO4J的安装配置及使用总结

    #工具:使用neo4j desktop版本# 一,下载工具 可以到官方网站上下载桌面版或者community版本的,下载地址:https://neo4j.com/, 安装好. 二.配置环境变量 本文参 ...

  8. 20-iframe

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 解决windows8.1的依赖

  10. OSG实现正八面体剖分成球

    #include<Windows.h> #include<osg/Node> #include<osg/Geode> #include<osg/Group&g ...