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

本文共 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

你可能感兴趣的文章
调试是新建数据中心成功运营的关键
查看>>
雅虎证实5亿账户被窃 刷新单一网站用户信息泄露纪录
查看>>
科学家警告:被黑客入侵的工业机器人可能将人类生命置于危险中
查看>>
你的电脑会感染勒索病毒吗?快用这款工具查一下
查看>>
村路安防建设加速 科学推进安全前行
查看>>
“业务为王”时代下,DevOps怎么玩?
查看>>
2017技术趋势:最受欢迎的几大工具
查看>>
*ST京蓝入股力合节能 着力绿色智慧城市服务
查看>>
缺陷上报统一模板及缺陷管理流程
查看>>
手机视频监控系统在智能家居中的应用
查看>>
Google AI子公司采用区块链技术来跟踪英国的健康数据
查看>>
力成科技股东会决议通过紫光投资案
查看>>
推荐10款免费的在线UI测试工具
查看>>
《嵌入式系统数字视频处理权威指南》—— 导读
查看>>
侵犯公民个人信息: “两高”首次出台司法解释 打击大数据征信乱象
查看>>
《Photoshop修色圣典(第5版)》—第1章1.13节你将是裁判
查看>>
《大数据算法》一2.4 数组有序的判定算法
查看>>
我的友情链接
查看>>
Option parsing
查看>>
学生信息管理系统
查看>>