BZOJ 2599 Race(树分治)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=2599
题意:给一棵树,每条边有权.求一条路径,权值和等于K,且边的数量最小.
题意:每次找到当前树的重心作为树根,查找通过当前树根的路径。
- #include<algorithm>
- #include<cstdio>
- #include<cmath>
- #include<cstring>
- #include<iostream>
- #include<ctime>
- int tot,go[],next[],first[],val[];
- int size[],F[],cnt[],a[],root,n,K,vis[];
- int dis[],ans,sz,h[],sum;
- long long sx;
- int read(){
- char ch=getchar();int t=,f=;
- while (ch<''||ch>'') {
- if (ch=='-') f=-;
- ch=getchar();
- }
- while (''<=ch&&ch<=''){
- t=t*+ch-'';
- ch=getchar();
- }
- return t*f;
- }
- void insert(int x,int y,int z){
- tot++;
- go[tot]=y;
- next[tot]=first[x];
- first[x]=tot;
- val[tot]=z;
- }
- void add(int x,int y,int z){
- insert(x,y,z);
- insert(y,x,z);
- }
- void findroot(int x,int fa){
- size[x]=;F[x]=;
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (pur==fa||vis[pur]) continue;
- findroot(pur,x);
- size[x]+=size[pur];
- F[x]=std::max(F[x],size[pur]);
- }
- F[x]=std::max(F[x],sum-size[x]);
- if (F[root]>F[x]) root=x;
- }
- void dfs1(int x,int fa){
- sx++;
- if (dis[x]>K) return;
- if (h[K-dis[x]]==sz) ans=std::min(ans,a[K-dis[x]]+cnt[x]);
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (pur==fa||vis[pur]) continue;
- cnt[pur]=cnt[x]+;
- dis[pur]=dis[x]+val[i];
- dfs1(pur,x);
- }
- }
- void dfs2(int x,int fa){
- if (dis[x]>K) return;
- if (h[dis[x]]!=sz) h[dis[x]]=sz,a[dis[x]]=cnt[x];
- else a[dis[x]]=std::min(a[dis[x]],cnt[x]);
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (pur==fa||vis[pur]) continue;
- dfs2(pur,x);
- }
- }
- int find(int x,int fa){
- int all=;
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (pur==fa||vis[pur]) continue;
- all+=find(pur,x);
- }
- return all;
- }
- void query(int x){
- h[]=++sz;
- a[]=;
- vis[x]=;
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (vis[pur]) continue;
- dis[pur]=val[i];
- cnt[pur]=;
- dfs1(pur,x);
- dfs2(pur,x);
- }
- for (int i=first[x];i;i=next[i]){
- int pur=go[i];
- if (vis[pur]) continue;
- root=;
- sum=find(pur,);
- findroot(pur,);
- query(root);
- }
- }
- int main(){
- n=read();K=read();
- for (int i=;i<n;i++){
- int x,y,z;
- x=read();
- y=read();
- z=read();
- x++;y++;
- add(x,y,z);
- }
- root=;
- F[]=n+;
- ans=n;
- sum=n;
- findroot(,);
- query(root);
- if (ans==n) ans=-;
- printf("%d\n",ans);
- }
BZOJ 2599 Race(树分治)的更多相关文章
- BZOJ.4184.shallot(线段树分治 线性基)
BZOJ 裸的线段树分治+线性基,就是跑的巨慢_(:з」∠)_ . 不知道他们都写的什么=-= //41652kb 11920ms #include <map> #include < ...
- BZOJ.4137.[FJOI2015]火星商店问题(线段树分治 可持久化Trie)
BZOJ 洛谷 一直觉得自己非常zz呢.现在看来是真的=-= 注意题意描述有点问题,可以看BZOJ/洛谷讨论. 每个询问有两个限制区间,一是时间限制\([t-d+1,t]\),二是物品限制\([L,R ...
- [BZOJ 4025]二分图(线段树分治+带边权并查集)
[BZOJ 4025]二分图(线段树分治+带边权并查集) 题面 给出一个n个点m条边的图,每条边会在时间s到t出现,问每个时间的图是否为一个二分图 \(n,m,\max(t_i) \leq 10^5\ ...
- BZOJ 2152: 聪聪可可 树分治
2152: 聪聪可可 Description 聪聪和可可是兄弟俩,他们俩经常为了一些琐事打起来,例如家中只剩下最后一根冰棍而两人都想吃.两个人都想玩儿电脑(可是他们家只有一台电脑)……遇到这种问题,一 ...
- BZOJ 2566 xmastree(树分治+multiset)
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2566 题意:一棵有边权的树.结点有颜色.每次修改一个点的颜色.求每次修改后所有同色 ...
- bzoj 4137 [FJOI2015]火星商店问题——线段树分治+可持久化01trie树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4137 关于可持久化01trie树:https://www.cnblogs.com/LadyL ...
- bzoj 4025 二分图——线段树分治+LCT
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4025 线段树分治,用 LCT 维护链的长度即可.不过很慢. 正常(更快)的方法应该是线段树分 ...
- UVA 12161 Ironman Race in Treeland (树分治)
题意:求树上的一条费用不超过m的路径,使得总长度尽量大. 人参第一发树分治,紫书上思路讲得比较清晰,这里不再赘述. 实现的时候,用一个类似时间戟的东西,记录结点首次访问的时间,并保存结点序列. 合并的 ...
- BZOJ 1018: [SHOI2008]堵塞的交通traffic(线段树分治+并查集)
传送门 解题思路 可以离线,然后确定每个边的出现时间,算这个排序即可.然后就可以线段树分治了,连通性用并查集维护,因为要撤销,所以要按秩合并,时间复杂度\(O(nlog^2 n)\) 代码 #incl ...
随机推荐
- windows下的用户态调试的底层与上层实现
操作系统:windows XP 调试器通过CreateProcess传入带有DEBUG_PROCESS和DEBUG_ONLY_THIS_PROCESS的dwCreationFlags创建被调试进程.这 ...
- Hadoop开发遇到的问题之reduce卡住
遇到的问题描述:在hadoop上面执行程序,程序运行之后能够正常执行.一切似乎都是正常的,然而过了一段时间之后程序便开始阻塞直到程序超时退出(如下). 14/08/19 21:17:51 INFO m ...
- c语言指针与结构体之内存动态分配
struct dangdangtest { ]; ]; ]; int num; int bugnum; ]; ]; double RMB; }; void main2() { //struct dan ...
- qt下面例子学习(部分功能)
from aa import Ui_Formfrom PyQt4.Qt import *from PyQt4.QtCore import *from PyQt4.QtGui import *from ...
- WebService-调用第三方提供的webService服务
互联网上面有很多的免费webService服务,我们可以调用这些免费的WebService服务,将一些其他网站的内容信息集成到我们的Web应用中显示,下面就以获取天气预报数据和查询国内手机号码归属地为 ...
- (转)iOS7界面设计规范(5) - UI基础 - 导航
通过分页控件(page control)来暗示多个条目或内容视图的存在.该控件可以有效的向用户展示内容单元的数量,以及当前所见的这一条在队列中的位置.请参考分页控件一节,了解更多详情. 注意:虽然工具 ...
- WP系统推广难的原因之中的一个之我见
个人也觉得如今的Android市场几家独大,竞争太激烈.利润空间挤压太严重,有实力的厂家不如尝试剑走偏锋,在其它大佬都还没跟进的时候,把市场投向WP.先入为主,不失为良策! 话说Microsoft不开 ...
- Button和ImageButton
Button----button ImageButton----图片button 共同拥有特征: 都能够作为一个button产生点击事件 不同点 1. Button有text的属性.ImageButt ...
- 压位加速-poj-2443-Set Operation
题目链接: http://poj.org/problem?id=2443 题目意思: 有n个集合(n<=1000),每个集合有m个数ai(m<=10000,1=<ai<=100 ...
- Android自定义控件(二)——有弹性的ScrollView
本文在http://gundumw100.iteye.com/blog/1075286的基础上稍作修改, 实现了当手指滑动到ScrollView的顶部.底部时, 可以继续的向上.向下拉伸.当释放手指的 ...