2756 树上的路径

 时间限制: 3 s     空间限制: 128000 KB     题目等级 : 大师 Master

题目描述 Description

给出一棵树,求出最小的k,使得,且在树中存在路径P,使得k>= S 且 k <=E. (k为路径P上的边的权值和)

输入描述 Input Description

第一行给出N,S,E,N代表树的点数,S,E如题目描述一致

下面N-1行给出这棵树的相邻两个节点的边及其权值W

输出描述 Output Description

输出一个整数k,表示存在路径P,并且路径上的权值和 K>=S , k<=E,若无解输出-1

样例输入 Sample Input

5 10 40

2 4 80

2 3 57

1 2 16

2 5 49

样例输出 Sample Output

16

数据范围及提示 Data Size & Hint

边权W<=10000,

保证答案在int(longint)范围内,且|E-S|<=50,

树上点的个数N<=30000

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define N 30009
 6 using namespace std;
 7 int n,A,B,K,la,head[N],next[N<<1],ans=2*1e9,size[N];
 8 int dep[N],maxson[N],root,tot,lls,num,ls[N];
 9 bool v[N];
10 struct node
11 {
12     int fr,to,len;
13 }a[N<<1];
14 void addedge(int x,int y,int z)
15 {
16     a[++la].fr=x,a[la].to=y,a[la].len=z;
17     next[la]=head[x],head[x]=la;
18 }
19 void get_root(int x,int from)
20 {
21     size[x]=1;
22     maxson[x]=0;
23     for(int i=head[x];i;i=next[i])
24         if (!v[ a[i].to ]&&a[i].to!=from)
25             {
26                 get_root(a[i].to,x);
27                 size[x]+=size[ a[i].to ];
28                 maxson[x]=max(maxson[x],size[ a[i].to ]);
29             }
30     maxson[x]=max( maxson[x],tot-size[x] );
31     if (!root||maxson[x]<maxson[root]) root=x;
32
33 }
34 void get_dep(int x,int from)
35 {
36     for (int i=head[x];i;i=next[i])
37         if (!v[ a[i].to ]&&a[i].to!=from)
38             {
39                 ls[++lls]=dep[ a[i].to ]=dep[x]+a[i].len;
40                 get_dep(a[i].to,x);
41
42             }
43 }
44 int get_num(int x,int jian)
45 {
46     int i,j,k,rt=0;
47     ls[ lls=1 ]=dep[x]=jian;
48     get_dep(x,0);
49
50     sort(ls+1,ls+lls+1);
51     for (i=1,j=lls;i<=lls;i++)
52         {
53             while (j>1&&ls[i]+ls[j]>K) j--;
54             if (j>i)rt+=j-i;
55         }
56     return rt;
57 }
58 void divide(int x)
59 {
60     num+=get_num(x,0);
61     v[x]=1;
62     for (int i=head[x];i;i=next[i])
63         if (!v[ a[i].to ])
64             {
65                 num-=get_num(a[i].to,a[i].len);
66                 tot=size[ a[i].to ];
67                 root=0,get_root(a[i].to,0);
68                 divide( root );
69             }
70 }
71 int main()
72 {
73     int i,j,k,x,y,z,last;
74     scanf("%d%d%d",&n,&A,&B);
75     for(i=1;i<n;i++)
76     {
77         scanf("%d%d%d",&x,&y,&z);
78         addedge(x,y,z),addedge(y,x,z);
79     }
80     last=1e9;
81     for(K=A-1;K<=B;K++)
82     {
83         num=0;
84         memset(v,0,sizeof(v));
85         tot=n,root=0;
86         get_root(1,0);
87         divide(root);
88         if(num>last)
89         {
90             printf("%d\n",K);
91             return 0;
92         }
93         last=num;
94     }
95     printf("-1\n");
96 }

备注:引用自Codevs 题解

转载于:https://www.cnblogs.com/suishiguang/p/6172038.html

Codevs 2756 树上的路径相关推荐

  1. CodeForces - 1521D Nastia Plays with a Tree(树上最小路径覆盖)

    题目链接:点击查看 题目大意:给出一棵树,可以删除 xxx 条边并增加 xxx 条边使得树变为竹子,竹子就是一条链,问 xxx 最小可以为多少,输出一种方案数 题目分析:树上最小路径覆盖,按照子节点个 ...

  2. bzoj3784 树上的路径 点分治+RMQ+优先队列

    题目分析 树上的路径路径?可以,这很点分治. 求最长的mmm条的长度?可以,着很优先队列. 但问题是,用优先队列只能做全局才能保证复杂度是对的,但点分治是分治就不能做全局. 于是对于每次点分治,都记录 ...

  3. [XSY3112] 接水果(树上包含路径,整体二分,扫描线)

    传送门 给出一棵nnn个点的树.接下来给出PPP条树上路径ai→bia_i\to b_iai​→bi​,及其权值cic_ici​.最后有QQQ个询问,每个询问给出一条树上路径ui→viu_i\to v ...

  4. BZOJ3784树上的路径

    题目描述 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a<b.将这n*(n-1)/2个距离从大到小排序, ...

  5. CF E2 - Daleks' Invasion (medium) (LCA求两点树上路径上的最大边权)

    http://codeforces.com/contest/1184/problem/E2 题意:给出一副图,首先求出这幅图的最小生成树 , 然后修改这幅图上不属于最小生成树的边权,使得修改后的图在求 ...

  6. SPOJ-COT-Count on a tree(树上路径第K小,可持久化线段树)

    题意: 求树上A,B两点路径上第K小的数 分析: 同样是可持久化线段树,只是这一次我们用它来维护树上的信息. 我们之前已经知道,可持久化线段树实际上是维护的一个前缀和,而前缀和不一定要出现在一个线性表 ...

  7. 【jzoj5055】【GDOI2017模拟二试4.12】【树上路径】【点分治】

    题目大意 给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值. 给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值恰好是p的倍数 ...

  8. JZOJ5055 树上路径

    Description 给定一颗n个结点的无根树,树上的每个点有一个非负整数点权,定义一条路径的价值为路径上的点权和-路径的点权最大值. 给定参数p,我们想知道,有多少不同的树上简单路径,满足它的价值 ...

  9. 线段树合并与分裂维护树上最长上升子序列 + 点分治删点 ---- 2021 牛客多校第一场 C - Cut the tree(详解)

    题目大意: 给你一个树,树上每个点都有一个权值valnodeval_{node}valnode​,路径(u,v)(u,v)(u,v) 上所有点按顺序有序序列,令f(u,v)f(u,v)f(u,v)是这 ...

最新文章

  1. linux连sql server
  2. PT60报错(在表 $ 中午关键字$的输入项目T555Z)
  3. 用jsphtml:file实现一个文件上传的例子,而且有验证
  4. python编译安装没有c扩展_为什么在安装simplejson时得到“C扩展无法编译”?
  5. mysql不使用swapp的原因_SolidWorks不能使用的原因
  6. xp计算机用户密码设置,XP怎么设置开机密码_XP系统设置开机密码教程-192路由网...
  7. Spring Boot项目在GitHub上初始化及控管步骤
  8. Windows开机自动启动Virtual Box虚拟机(官方指南手册)
  9. Linux内核配置.config文件
  10. 论MongoDB索引选择的重要性
  11. 阿里云常用产品汇总及解释
  12. STM32单片机网络通信调试
  13. 记录下一个带内购的iOS app的上架App Store历程
  14. Local Generic Representation for Face Recognition with Single Sample per Person (ACCV, 2014)
  15. 高光谱图像去噪相关资源汇总(常用对比算法+数据集+评价指标)
  16. 网站内嵌百度地图定向到公司位置
  17. Alpine系统介绍
  18. 谈谈我的框架设计经验
  19. 三子棋(N子棋)游戏的保姆级超详细教程(C语言)
  20. 关闭Windows Defender实时保护解决下载激活软件报检测到病毒无法下载的问题

热门文章

  1. 解决win2003安装exchangeServer后关机慢的方法
  2. 米线店结账程序 装饰着模式_实验报告2_装饰者模式
  3. vector元素的读取
  4. matlab imaqhwinfo
  5. 836c语言程序设计,2017年辽宁师范大学计算机应用研究所836C语言程序设计考研强化模拟题...
  6. spring中的设计模式_面试:设计模式在spring中的应用
  7. 可能是最先出来的关于介绍使用Vue3的一本书
  8. “全人类的知识宝藏”维基百科迎来了20岁的生日!
  9. ajax后台怎么取mapp,后台管理实现
  10. android拍照功能无预览,Android 无预览拍照