[BZOJ2599]Race
Description
给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000
Input
第一行 两个整数 n, k
第二..n行 每行三个整数 表示一条无向边的两端和权值 (注意点的编号从0开始)
Output
一个整数 表示最小边数量 如果不存在这样的路径 输出-1
Sample Input
0 1 1
1 2 2
1 3 4
Sample Output
HINT
2018.1.3新加数据一组,未重测
Source
很简单的一道点分治,注意一下维护的顺序,先更新答案再更新桶数组
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #define M 200010 5 using namespace std; 6 int n,m,num,rt,ans,k,S; 7 int maxn[M],head[M],dis[M],d[M],size[M],t[M<<3]; 8 bool vis[M]; 9 struct point{int to,next,dis;}e[M<<1]; 10 void add(int from,int to,int dis) { 11 e[++num].next=head[from]; 12 e[num].to=to; 13 e[num].dis=dis; 14 head[from]=num; 15 } 16 void getroot(int x,int fa) { 17 size[x]=1;maxn[x]=0; 18 for(int i=head[x];i;i=e[i].next) { 19 int to=e[i].to; 20 if(to==fa||vis[to]) continue; 21 getroot(to,x),size[x]+=size[to]; 22 maxn[x]=max(maxn[x],size[to]); 23 } 24 maxn[x]=max(maxn[x],S-size[x]); 25 if(maxn[x]<maxn[rt]) rt=x; 26 } 27 void cal(int x,int fa) { 28 if(dis[x]>k) return; 29 ans=min(ans,d[x]+t[k-dis[x]]); 30 for(int i=head[x];i;i=e[i].next) { 31 int to=e[i].to; 32 if(vis[to]||to==fa) continue; 33 d[to]=d[x]+1,dis[to]=dis[x]+e[i].dis; 34 cal(to,x); 35 } 36 } 37 void insert(int x,int fa) { 38 if(dis[x]<=k) { 39 t[dis[x]]=min(t[dis[x]],d[x]); 40 for(int i=head[x];i;i=e[i].next) 41 if(!vis[e[i].to]&&e[i].to!=fa) 42 insert(e[i].to,x); 43 } 44 } 45 void del(int x,int fa) { 46 if(dis[x]<=k) { 47 t[dis[x]]=1e9; 48 for(int i=head[x];i;i=e[i].next) 49 if(!vis[e[i].to]&&e[i].to!=fa) 50 del(e[i].to,x); 51 } 52 } 53 void solve(int x) { 54 vis[x]=true;t[0]=0; 55 for(int i=head[x];i;i=e[i].next) { 56 int to=e[i].to; 57 if(vis[to]) continue; 58 d[to]=1,dis[to]=e[i].dis,cal(to,0); 59 insert(to,x); 60 } 61 for(int i=head[x];i;i=e[i].next) 62 if(!vis[e[i].to]) 63 del(e[i].to,x); 64 for(int i=head[x];i;i=e[i].next) { 65 int to=e[i].to; 66 if(vis[to]) continue; 67 rt=0,S=size[to],getroot(to,0); 68 solve(rt); 69 } 70 } 71 int main() { 72 scanf("%d%d",&n,&k);ans=n+1; 73 memset(t,1,sizeof(t)); 74 for(int i=1;i<n;i++) { 75 int a,b,c;scanf("%d%d%d",&a,&b,&c); 76 a++,b++; 77 add(a,b,c),add(b,a,c); 78 } 79 S=maxn[0]=n;getroot(1,0); 80 solve(rt); 81 if(ans>n) puts("-1"); 82 else printf("%d\n",ans); 83 return 0; 84 }
转载于:https://www.cnblogs.com/Slrslr/p/10027299.html
[BZOJ2599]Race相关推荐
- 2016区域赛前冲刺训练
UPD 2016.10.23 shift-and (2题) Codeforces 训练 现在已经完成了: 191 [Codeforces Round #377] (6/6) Div 2 A Buy a ...
- 【BZOJ-2599】Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MB Submit: 2590 Solved: 769 [Submit][Stat ...
- [BZOJ2599][IOI2011]Race 点分治
2599: [IOI2011]Race Time Limit: 70 Sec Memory Limit: 128 MB Submit: 3934 Solved: 1163 [Submit][Sta ...
- Blender赛车动画制作学习教程 Learn Race Car Animation with Blender
使用Blender 2.93创建您自己的惊人汽车动画 你会学到什么 Blender的界面和导航 建模 UV制图 材料 动画 照明设备 渲染 合成 要求 下载并安装Blender.免费下载和免费用于任何 ...
- 数据竞争(data race)问题分析的利器——valgrind的Helgrind
数据竞争(data race)是指在非线程安全的情况下,多线程对同一个地址空间进行写操作.一般来说,我们都会通过线程同步方法来保证数据的安全,比如采用互斥量或者读写锁.但是由于某些笔误或者设计的缺陷, ...
- java race condition_java多线程(一)Race Condition现象及产生的原因
什么是Race Condition 首先,什么是Race Condition呢,Race Condition中文翻译是竞争条件,是指多个进程或者线程并发访问和操作同一数据且执行结果与访问发生的特定顺序 ...
- explicit specialization of ‘Race‘ after instantiation ,implicit instantiation first required here。
报错1: E:\project\qt\Pokemon3\PokemonServer\pokemon.cpp:470: error: specialization of 'Race::Race() [w ...
- 后生可畏!中国军团称霸阅读理解竞赛RACE:微信AI称王,高中生力压腾讯康奈尔联队(附资料)...
本文经AI新媒体量子位(公众号ID:qbitai )授权转载,转载请联系出处 本文约4000字,建议阅读5分钟. 本文为你介绍了由CMU语言技术研究所发起RACE数据集活动中,中国军团雄霸天下的情况. ...
- golang-exec cmd data race
问题背景:bytes.Buffer grow panic panic: runtime error: slice bounds out of range [:1024] with capacity 5 ...
最新文章
- java 大臣的旅费_PREV-9-蓝桥杯-历届试题-大臣的旅费-java
- 体感Kinect手势识别开发基本原理
- 我的Windows Vista™也装好了...
- 《那些年啊,那些事——一个程序员的奋斗史》——86
- 超链接把一个值传到多个页面的方法
- MySQL简明教程-下
- Visio Professional详细教程(一)
- matlab按图像边缘抠图_不会抠图?保姆级抠图教程!手把手教你抠图(二)
- 微软王码五笔98版 v5.2 下载
- android模拟器快捷键,Android模拟器快捷键大全
- 虚拟服务器跟目录,如何找虚拟主机根目录?
- phpstorm 配置 Xdebug 调试
- 查询结果按照字母顺序排序
- MATLAB 图像嵌入水印图像程序
- 测试架构需要具备哪些能力
- 【华人学者风采】马帅 北京航空航天大学
- Sping IOC 理解(转)
- 每日一题 笨拙的手指
- SpringBoot初始化过程核心源码剖析
- 在跑SC-LEGO-LOAM时报错[pcl::KdTreeFLANN::setInputCloud] Cannot create a KDTree with an empty input cloude
热门文章
- Android ExpandableListView几个特殊的属性
- java连接mysql数据库jdbc
- Python操作Excel表格
- 使用CXF 2.7.5出现的java.lang.RuntimeException: Cannot create a secure XMLInputFactory错误解决...
- centos中使用python遇到的几个问题
- 当Linux提权不能反弹Shell时利用metasploit进行提权
- FLASH开发[02]
- Mapper动态代理开发所要遵循的四个原则
- Java selenium操作下拉滚动条的几种方法
- 研诺首款D类音频放大器延长便携应用中的电池寿命