博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ2599:[IOI2011]Race(点分治)
阅读量:5925 次
发布时间:2019-06-19

本文共 1299 字,大约阅读时间需要 4 分钟。

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
2 #include
3 #include
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]

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

你可能感兴趣的文章
frame buffer编程--画点功能和新增字符串代替RGBT
查看>>
form
查看>>
rails generator
查看>>
【矩阵乘法】OpenJ_POJ - C17F - A Simple Math Problem
查看>>
[转载]JDBC/Spring/MyBatis性能比较
查看>>
Impala入门笔记
查看>>
crontab定时任务中文乱码问题
查看>>
Locations Section of OpenCascade BRep
查看>>
RvmTranslator7.0-OBJ
查看>>
sharding-jdbc学习
查看>>
leetcode 56: Word Search
查看>>
[旧博客]Python 第一次
查看>>
django rest framework 过滤 lim分页
查看>>
Integer to Roman
查看>>
php优化-》常用到的部分优化
查看>>
软件工程现行国标汇集
查看>>
CCNA第二章
查看>>
SmartDraw_2012_Enterprise_R20.0.1.0的安装使用
查看>>
Django Form组件
查看>>
JSP之三大指令
查看>>