题面:(复制别人的。。。)

Description

给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小.

Input

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

Output

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

Sample Input

4 3
0 1 1
1 2 2
1 3 4

Sample Output

2
 
这道题好像是权限题。。bzoj上看不到这道题更别说交了。。。
写了半天结果交不了,样例过了就当过了吧。。QAQ
 
思路:
多建一个cnt数组表示权值为i的最小边长,得到每个点到根节点的边长和权值和然后逐个更新就好了。
 
实现代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 1e5 + ;
int n,k,cnt1,root,f[M],head[M],siz[M],cnt[M],dis[M],vis[M],sum,ans; struct node{
int to,next,w;
}e[M]; void add(int u,int v,int w){
e[++cnt1].to=v;e[cnt1].next=head[u];e[cnt1].w=w;head[u]=cnt1;
} void get_root(int u,int fa){
f[u] = ; siz[u] = ;
for(int i = head[u];i;i=e[i].next){
int v = e[i].to;
if(v == fa||vis[v]) continue;
get_root(v,u);
siz[u] += siz[v];
f[u] = max(f[u],siz[v]);
}
f[u] = max(sum-siz[u],f[u]);
if(f[u] < f[root]) root = u;
} void get_dis(int u,int fa,int dep){
if(dis[u] >= &&dis[u] <= k) ans = min(ans,dep + cnt[k-dis[u]]);
for(int i = head[u];i;i=e[i].next){
int v = e[i].to;
if(v==fa||vis[v]) continue;
dis[v] = dis[u] + e[i].w;
get_dis(v,u,dep+);
}
} void cal(int u,int fa,int dep,int flag){
if(dis[u] >= &&dis[u] <= k) {
if(flag) cnt[dis[u]] = min(dep,cnt[dis[u]]);
else cnt[dis[u]] = n;
}
for(int i = head[u];i;i=e[i].next){
int v = e[i].to;
if(v==fa||vis[v]) continue;
cal(v,u,dep+,flag);
}
} void solve(int u){
vis[u] = ; cnt[] = ;
for(int i = head[u];i;i=e[i].next){
int v = e[i].to;
if(vis[v]) continue;
dis[v] = e[i].w;
get_dis(v,,);
cal(v,,,);
}
for(int i = head[u];i;i=e[i].next){ //初始化
int v = e[i].to;
if(vis[v]) continue;
cal(v,,,);
}
for(int i = head[u];i;i = e[i].next){
int v = e[i].to;
if(vis[v]) continue;
root = ;
sum = siz[v];
get_root(v,);
solve(v);
}
} int main()
{
int a,b,c;
scanf("%d%d",&n,&k);
ans = n;cnt1=;
for(int i = ;i < n;i ++){
scanf("%d%d%d",&a,&b,&c);
a++;b++;
add(a,b,c); add(b,a,c);
}
for(int i = ;i <= k;i ++) cnt[i] = n;
root = ;f[] = n; sum = n;get_root(,);
solve(root);
printf("%d\n",(ans==n)?-:ans);
}

bzoj 2599: [IOI2011]Race (点分治 本地过了就是过了.jpg)的更多相关文章

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

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

  2. bzoj 2599 [IOI2011]Race 点分

    [IOI2011]Race Time Limit: 70 Sec  Memory Limit: 128 MBSubmit: 4768  Solved: 1393[Submit][Status][Dis ...

  3. bzoj 2599 [IOI2011]Race (点分治)

    [题意] 问树中长为k的路径中包含边数最少的路径所包含的边数. [思路] 统计经过根的路径.假设当前枚举到根的第S个子树,若x属于S子树,则有: ans<-dep[x]+min{ dep[y] ...

  4. BZOJ 2599 [IOI2011]Race【Tree,点分治】

    给出N(1 <= N <= 200000)个结点的树,求长度等于K(1 <= K <= 1000000)的路径的最小边数. 点分治,这道题目和POJ 2114很接近,2114是 ...

  5. 【BZOJ】2599: [IOI2011]Race 点分治

    [题意]给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000.注意点从0开始编号,无解输出-1. [算法]点分治 [题解] ...

  6. bzoj 2599: [IOI2011]Race【点分治】

    点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p]) 这里注意更新和初 ...

  7. 【刷题】BZOJ 2599 [IOI2011]Race

    Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...

  8. BZOJ 2599: [IOI2011]Race

    点分治,定权值,求另一关键字最小 不满足前缀加减性 可以按序遍历,用一数组$t[] 来维护路径为i的最小边数$ 再对于一个直系儿子对应的子树,先算距离求答案再更新$t数组,这样就不会重复$ #incl ...

  9. 2599: [IOI2011]Race

    2599: [IOI2011]Race 链接 分析 被memset卡... 点分治,对于重心,遍历子树,记录一个数组T[i],表示以重心为起点的长度为i的路径中最少的边数是多少.然后先遍历子树,更新答 ...

随机推荐

  1. TCP/IP协议---广播和多播及IGMP协议

    老板找某个高层谈话,这是一对一形式.当老板叫来所有高层谈话,那么就变为了一对多.计算机网络中也是如此,当一个主机需要和更多机器对话时,就有了广播和多播这种形式. 广播和多播仅应用于UDP,它们对需将报 ...

  2. 使用Windows API进行串口编程

    使用Windows API进行串口编程   串口通信一般分为四大步:打开串口->配置串口->读写串口->关闭串口,还可以在串口上监听读写等事件.1.打开和关闭串口Windows中串口 ...

  3. ASP.NET Core MVC中URL和数据模型的匹配

    Http GET方法 首先我们来看看GET方法的Http请求,URL参数和ASP.NET Core MVC中Controller的Action方法参数匹配情况. 我定义一个UserController ...

  4. Luogu4546 THUWC2017 在美妙的数学王国中畅游 LCT、泰勒展开

    传送门 题意:反正就是一堆操作 LCT总是和玄学东西放在一起我们不妨令$x_0=0.5$(其实取什么都是一样的,但是最好取在$[0,1]$的范围内),将其代入给出的式子,我们得到的$f(x)$的式子就 ...

  5. angularjs的ng-change事件演示

    今天练习angularjs的ng-change事件. 比如用户作出选择时,系统所指定的选项中,没有用户合适的选项.此时我们可以让用户填写. 刚开始文本框是隐藏的.当用户选择了checkbox之后才会显 ...

  6. CF 859E Desk Disorder

    题目大意:一个经典的游戏:抢椅子.有\(n\)个人以及\(2n\)把椅子.开始时每个人坐在一把椅子上,而且他们每个人都有一个下一步想坐的位置(可以与之前重合).每一个下一次可以在自己现在做的椅子和想坐 ...

  7. shell脚本中的数据传递方式

    shell中支持的数据传递方式 主要有那么几种: 变量.管道.结果引用.重定向+文件.以及xargs. 变量方式: 1. 定义变量: 变量名=值 2. 使用变量: $变量名 管道方式: 统计当前文件夹 ...

  8. Linux Shell完成Qt程序的自动部署

    #!/bin/sh #取当前脚本的绝对路径 srcDir=$(cd ")";pwd) #设置库所在路径 libDir=${srcDir}"/J1900RunLib/*&q ...

  9. Excel 中批量处理数据(改成 json 格式)

    如下excel: 需要处理成下面的效果: 方法: 在 C2 中输入公式: ="{"""&"code"&"" ...

  10. FreeRTOS 任务与调度器(1)

    前言: Task.c和Task.h文件内是FreeRTOS的核心内容,所有任务和调度器相关的API函数都在这个文件中,它包括下图这些内容FreeRTOS文件如下: Task.c和Task.h文件内是F ...