codevs 2756树上的路径
题意:
2756 树上的路径
给出一棵树,求出最小的k,使得,且在树中存在路径P,使得k>= S 且 k <=E. (k为路径P上的边的权值和)
第一行给出N,S,E,N代表树的点数,S,E如题目描述一致
下面N-1行给出这棵树的相邻两个节点的边及其权值W
输出一个整数k,表示存在路径P,并且路径上的权值和 K>=S , k<=E,若无解输出-1
5 10 40
2 4 80
2 3 57
1 2 16
2 5 49
16
边权W<=10000,
保证答案在int(longint)范围内,且|E-S|<=50,
树上点的个数N<=30000
————————————————————————————————————————————————————————
求树上一条路径,长度k在S到E之间,且k最小。
方法为从小到大枚举k的值,如果长度不超过k的点对数比长度不超过k-1的点对数多则一定存在长度为k的点对,则输出k并退出。
1、如果S到E的区间比较大,则可以使用二分,但是本题中只有50,可以依次枚举。
2、查找点对数为树上的点分治,和上一题相同。
3、注意init()的位置,这个地方出了错……
————————————————————————————————————————————————————————
//codevs 2756鏍戜笂鐨勮矾寰?
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm> using namespace std;
const int maxn=;
int n,S,E;
struct edge
{
int u,v,w,next;
}e[*maxn];
int head[maxn],js=,mi,jst,root;
bool vis[maxn];
int siz[maxn],mx[maxn],dis[maxn];
int ans,preans,k;
void readint(int &x)
{
char c=getchar();
int f=;
for(;c>''||c<'';c=getchar())if(c=='-')f=-f;
x=;
for(;c<=''&&c>='';c=getchar())x=x*+c-'';
x=x*f;
}
void addage(int u,int v,int w)
{
e[++js].u=u;e[js].v=v;e[js].w=w;
e[js].next=head[u];head[u]=js;
}
void init()
{
memset(vis,,sizeof(vis));
ans=;
}
void dfssize(int u,int f)
{
siz[u]=;
mx[u]=;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v!=f && !vis[v])
{
dfssize(v,u);
siz[u]+=siz[v];
if(siz[v]>mx[u])mx[u]=siz[v];
}
}
}
void dfsroot(int r,int u,int f)
{
if(siz[r]-siz[u]>mx[u])mx[u]=siz[r]-siz[u];
if(mx[u]<mi)
{
mi=mx[u];
root=u;
}
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v!=f && !vis[v])
dfsroot(r,v,u);
}
}
void dfsdis(int u,int d,int f)
{
dis[jst++]=d;
for(int i=head[u];i;i=e[i].next)
{
int v=e[i].v;
if(v!=f && !vis[v])dfsdis(v,d+e[i].w,u);
}
}
int calc(int u,int d)
{
jst=;
dfsdis(u,d,);
int dds=;
sort(dis,dis+jst);
int i=,j=jst-;
while(i<j)
{
while(dis[i]+dis[j]>k && i<j)j--;
dds+=j-i;
i++;
}
return dds;
}
void dfs(int u)
{
mi=n;
dfssize(u,);
dfsroot(u,u,);
ans+=calc(root,);
vis[root]=;
for(int i=head[root];i;i=e[i].next)
{
int v=e[i].v;
if(!vis[v])
{
ans-=calc(v,e[i].w);
dfs(v);
}
}
}
int main()
{
readint(n);readint(S);readint(E);
for(int u,v,w,i=;i<n;i++)
{
readint(u);readint(v);readint(w);
addage(u,v,w);addage(v,u,w);
}
init();
k=S-;
dfs();
for(int i=S;i<=E;i++)
{
preans=ans;
init();
k=i;
dfs();
if(ans>preans)
{
printf("%d\n",i);
return ;
}
}
printf("-1\n");
return ;
}
codevs 2756树上的路径的更多相关文章
- Codevs 2756 树上的路径
2756 树上的路径 时间限制: 3 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 给出一棵树,求出最小的k,使得,且在树中存在 ...
- 【BZOJ-3784】树上的路径 点分治 + ST + 堆
3784: 树上的路径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 462 Solved: 153[Submit][Status][Discuss ...
- bzoj 3784: 树上的路径 堆维护第k大
3784: 树上的路径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 88 Solved: 27[Submit][Status][Discuss] ...
- 【BZOJ3784】树上的路径 点分治序+ST表
[BZOJ3784]树上的路径 Description 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a< ...
- 树上的路径 BZOJ 3784
树上的路径 [问题描述] 给定一个N个结点的树,结点用正整数1..N编号.每条边有一个正整数权值.用d(a,b)表示从结点a到结点b路边上经过边的权值.其中要求a<b.将这n*(n-1)/2个距 ...
- BZOJ 3784: 树上的路径
Description 问一棵树上前 \(k\) 大路径的边权. Sol 边分治. 非常感谢数据没有菊花图. 为了写写边分治试试然后就开了这道题. 边分治非常好想,选一条重边,分成两部分,然后分别求最 ...
- SPOJ COT2 树上找路径上不同值的个数
题目大意 给出多个询问u , v , 求出u-v路径上点权值不同的个数 开始做的是COT1,用主席树写过了,理解起来不难 很高兴的跑去做第二道,完全跟普通数组区间求k个不同有很大区别,完全没思路 膜拜 ...
- CTSC模拟题 树上的路径
Description 给定一棵\(N\)个结点的树,结点用正整数\(1 \dots N\)编号,每条边有一个正整数权值.用\(d(a, b)\)表示从结点\(a\)到结点\(b\)路径上经过边的权值 ...
- BZOJ.3784.树上的路径(点分治 贪心 堆)
BZOJ \(Description\) 给定一棵\(n\)个点的带权树,求树上\(\frac{n\times(n-1)}{2}\)条路径中,长度最大的\(m\)条路径的长度. \(n\leq5000 ...
随机推荐
- 20151217JS便签
JS便签: 根据一个数值来改变Repeater行数的颜色 <script type="text/javascript"> var query = document.ge ...
- [ExtJS5学习笔记]第三节 sencha cmd学习笔记 生成应用程序构建的内部细节
本文地址: http://blog.csdn.net/sushengmiyan/article/details/38316829本文作者:sushengmiyan------------------- ...
- node版本管理器nvm(服务器项目相关)
git项目 https://github.com/creationix/nvm 1.下载并安装NVM脚本 curl https://raw.githubusercontent.com/creation ...
- JAVA监听器原理
http://blog.csdn.net/longyulu/article/details/25054697 JAVA监听器原理 标签: 监听器 2014-05-05 15:40 9070人阅读 评论 ...
- win7 :安装SQL2005
转载:http://www.cnblogs.com/icewee/articles/2019783.html 操作系统:Microsoft Windows 7 旗舰版(64位) 数据库版本:SQL ...
- vs2010中使用Nunit测试c#代码结果的正确性
本文转载自:http://blog.csdn.net/pukuimin1226/article/details/8112151 http://www.nunit.org/index.php?p=dow ...
- 黄聪:No 'Access-Control-Allow-Origin' header is present on the requested resource解决办法
在.htaccess文件里面添加下面代码: <IfModule mod_headers.c> Header set Access-Control-Allow-Origin "*& ...
- [转]理解android.intent.category.LAUNCHER 具体作用
转自:http://blog.csdn.net/jackrex/article/details/9189657 android.intent.category.LAUNCHER 具体有什么作用?我做一 ...
- DOM节点的修改
首先,我们将最后段落赋值给变量my: var my = document.getElementById('closer'); 接下来,我们就能够轻松地通过修改对象的innerHTML值来修改段落中的文 ...
- android studio新项目时提示:Plugin is too old, please update to a more recent version
今天想写一个程序来测试一下android studo代码,但是创建好项目后,提示: Error:(1, 0) Plugin is too old, please update to a more re ...