【DFS好题】BZOJ1999- [Noip2007]Core树网的核(数据加强版)
NOIP的数据好水,一开始有好几个错结果NOIP数据就水过了??
【题目大意】
求无根树的直径上一段不超过S长的链,使得偏心距最小。具体概念见原题。
【思路】
首先明确几个性质:
(1)对于树中的任意一点,距离其最远的点一定是树的直径的某一端点。
(2)所有的直径是等价的,即任意一条所能求出的该最小偏心距相等。
于是我们可以用两次dfs求出直径。任取一个点找到离它最远的点r,再从r找到距离它最远的点l。l到r的路径就是直径。
显然在长度不超过S的情况下,链最长最好。在l到r上维护尽可能长的链,找到左右端点到直径做右端点的较大值的最小值。然后由链上各个点出发,找到不经过直径上的点抵达的其他点的最大深度。这个最大深度和之前的最小值中较大的就是答案。
为什么是整条直径上找最大深度,而不是在核上找呢?
显然,如果这个深度最深的点不是从核中的点,那么它到核的距离必定小于核的端点到直径端点的距离。所以如果有个节点到核的距离小于核的端点到直径端点的距离,那么它必定是从核上延伸出去的。
【错误点】
具体见程序。
#include<bits/stdc++.h>
using namespace std;
const int MAXN=+;
const int INF=0x7fffffff;
struct edge
{
int to,len;
};
vector<edge> E[MAXN];
int n,s;
int l,r,dis[MAXN],f[MAXN],ban[MAXN]; void addedge(int u,int v,int w)
{
E[u].push_back((edge){v,w});
E[v].push_back((edge){u,w});
} void init()
{
scanf("%d%d",&n,&s);
for (int i=;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
addedge(u,v,w);
}
} void dfs(int u,int fa)
{
f[u]=fa;
for (int i=;i<E[u].size();i++)
{
int to=E[u][i].to;
if (ban[to] || to==f[u]) continue;
dis[to]=dis[u]+E[u][i].len;
dfs(to,u);
}
} void getd()
{
memset(ban,,sizeof(ban)); l=,r=;
dfs(l,);
for (int i=;i<=n;i++) if (dis[i]>dis[r]) r=i; l=r;
dis[r]=;
dfs(r,);
for (int i=;i<=n;i++) if (dis[i]>dis[l]) l=i;
} void solve()
{
int i=l,j=l,ans=INF;
for (;i;i=f[i])
{
while (f[j] && dis[i]-dis[f[j]]<=s) j=f[j];
ans=min(ans,max(dis[j],dis[l]-dis[i]));
//每次找到以i为一个端点的最接近于S的链
//比较两端点和直径端点的长度
}
for (i=l;i;i=f[i]) ban[i]=;
//由于要找出不经过直径的最大深度,所以禁止访问直径上的点
for (int i=l;i;i=f[i]) dis[i]=,dfs(i,f[i]);
//★★★★★★★注意这里i的父亲必须传进去f[i],否则就修改了直径
for (int i=;i<=n;i++) ans=max(ans,dis[i]);
printf("%d",ans);
} int main()
{
init();
getd();
solve();
return ;
}
【DFS好题】BZOJ1999- [Noip2007]Core树网的核(数据加强版)的更多相关文章
- [bzoj1999][noip2007]Core树网的核
好久没写题解了.这题不算太水就写一下题解. 话说回来,虽然不水但是挺裸.可以说题意即一半题解了. 我猜粘了题面也没有人去看的,所以直接人话题意了. 给一棵树,点数1e6,(当年noip的n当然是只有3 ...
- [BZOJ1999][codevs1167][Noip2007]Core树网的核
[BZOJ1999][codevs1167][Noip2007]Core树网的核 试题描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(t ...
- BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP
BZOJ_1999_[Noip2007]Core树网的核_单调队列+树形DP Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T ...
- BZOJ1999 树网的核[数据加强版]
1999: [Noip2007]Core树网的核 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1214 Solved: 336[Submit][St ...
- 【bzoj1999】[Noip2007]Core树网的核 树的直径+双指针法+单调队列
题目描述 给出一棵树,定义一个点到一条路径的距离为这个点到这条路径上所有点的距离的最小值.求一条长度不超过s的路径,使得所有点到这条路径的距离的最大值最小. 输入 包含n行: 第1行,两个正整数n和s ...
- [BZOJ1999] 树网的核 [数据加强版] (树的直径)
传送门 如果只是想验证算法正确性这里是洛谷数据未加强版 Description 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边带有正整数的权,我们称T为树网(treenet ...
- 洛谷 1099 ( bzoj 1999 ) [Noip2007]Core树网的核
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1999 <算法竞赛进阶指南>346页.https://www.cnblogs.co ...
- [Noip2007]Core树网的核
嘟嘟嘟 首先求树的直径两次bfs即可,实际上bfs就是最短路,因为树上路径是唯一的,所以用任何一种遍历方法都行(spfa和dijkstra当然也可以). 可以证明,只要求出任意一条直径就行了,为什么呢 ...
- bzoj 1999: [Noip2007]Core树网的核【树的直径+单调队列】
我要懒死了,所以依然是lyd的课件截图 注意是min{max(max(d[uk]),dis(u1,ui),dis(uj,un))},每次都从这三个的max里取min #include<iostr ...
随机推荐
- UNIX环境高级编程 第7章 进程环境
本章涉及C/C++程序中main函数是如何被调用的.命令行参数如何传递给main函数.程序的内存空间布局.程序如何使用环境变量.程序如何终止退出. main函数 C程序或C++程序总是从main函数开 ...
- 2016.07.13-vector<vector<int>>应用2——Two Sum扩展
收获: vector<vector<int> >res,不能直接用res[j].push_back(number),因为res[j]是空的,没有初始化 可以先定义 vector ...
- C#事件实现文件下载时进度提醒
C#中的事件是建立在委托的基础上,标准的事件模型应该包括以下几点: 声明一个用于定义事件的委托,这里用系统自带的泛型委托原型EventHandler<TEventArgs>,如:publi ...
- Fiddler是最强大最好用的Web调试工具
Fiddler是最强大最好用的Web调试工具之一,它能记录所有客户端和服务器的http和https请求,允许你监视,设置断点,甚至修改输入输出数据. 使用Fiddler无论对开发还是测试来说,都有很大 ...
- js如何查看元素类型
<script type="text/javascript"> //定义变量temp var temp = Object.prototype.toString.appl ...
- java基础48 IO流技术(序列流)
本文知识点目录: 1.SequenceInputStream序列流的步骤 2.实例 3.附录(音乐的切割与合并) 1.SequenceInputStream序列流的步骤 1.找到目标文件 ...
- python 常用的标准库及第三方库
标准库Python拥有一个强大的标准库.Python语言的核心只包含数字.字符串.列表.字典.文件等常见类型和函数,而由Python标准库提供了系统管理.网络通信.文本处理.数据库接口.图形系统.XM ...
- SQL 2008 还原SQL 2005备份文件不成功的解决方
在SQL Server 2008 r2上还原一个SQL Server 2005时,还原不成功,提示如下信息: 按照如下情况则还原成功: -- 查看备份文件的类型 RESTORE FILELISTONL ...
- 不用的代码,存一份--用tornado实现的websocket
因为现在使用Channels来实现啦, 这样就在Django的体系里自已弄完了. 方便后期代码维护和服务器部署. 这份土陋的东东,就放起来吧. 毕竟,通过读取文件来返回实时websocket,不适应于 ...
- GridView监听器
package com.example.wang.testapp2; import android.os.Bundle; import android.support.v7.app.AppCompat ...