BZOJ 1509[NOI 2003]逃学的小孩 树形dp
1509: [NOI2003]逃学的小孩
Time Limit: 5 Sec Memory Limit: 64 MB
Submit: 995 Solved: 505
[Submit][Status][Discuss]
Description

Input
Output
Sample Input
1 2 1
2 3 1
3 4 1
Sample Output
题解:
这道题目只能讲
这个很关键,所以记录第二长的边乘以两倍,就OK了
什么树形dp,没有的。
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define N 200007
#define ll long long
using namespace std; int n,m;ll ans;
int cnt,head[N],next[N*],rea[N*];ll val[N*];
bool boo[N];
struct Node
{
int pos;ll dis;
}a[N][]; bool cmp(Node x,Node y){return x.dis>y.dis;}
void add(int u,int v,int fee){next[++cnt]=head[u],head[u]=cnt,rea[cnt]=v,val[cnt]=fee;}
void dfs_init(int u,int fa)
{
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i],fee=val[i];
if (v==fa) continue;
dfs_init(v,u);
a[u][].pos=v;
a[u][].dis=a[v][].dis+fee;
sort(a[u]+,a[u]++,cmp);
}
ans=max(ans,a[u][].dis+*a[u][].dis+a[u][].dis);
}
void dfs_solve(int u)
{
boo[u]=;
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i],fee=val[i];
if (boo[v])
{
if (a[v][].pos!=u) a[u][].dis=a[v][].dis+fee;
else a[u][].dis=a[v][].dis+fee;
a[u][].pos=v;
sort(a[u]+,a[u]++,cmp);
break;
}
}
ans=max(ans,a[u][].dis+*a[u][].dis+a[u][].dis);
for (int i=head[u];i!=-;i=next[i])
{
int v=rea[i];
if (!boo[v]) dfs_solve(v);
}
}
int main()
{
memset(head,-,sizeof(head));
scanf("%d%d",&n,&m);
int x,y,z;
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z),add(y,x,z);
}
dfs_init(,-);
dfs_solve();
printf("%lld\n",ans);
}
BZOJ 1509[NOI 2003]逃学的小孩 树形dp的更多相关文章
- BZOJ 1509: [NOI2003]逃学的小孩( 树形dp )
树形dp求出某个点的最长3条链a,b,c(a>=b>=c), 然后以这个点为交点的最优解一定是a+2b+c.好像还有一种做法是求出树的直径然后乱搞... ----------------- ...
- NOI 2003 逃学的小孩 (树的直径)
[NOI2003 逃学的小孩] 题目描述 Chris家的电话铃响起了,里面传出了Chris的老师焦急的声音:"喂,是Chris的家长吗?你们的孩子又没来上课,不想参加考试了吗?"一 ...
- [NOI 2003] 逃学的小孩
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1509 [算法] 树的直径 [代码] #include<bits/stdc++. ...
- BZOJ1509: [NOI2003]逃学的小孩 (树形DP)
题意:给一棵树 选三个点A,B,C 求A到B的再从B到C的距离最大值 需要满足AB的距离小于AC的距离 题解:首先树上的最大距离就想到了直径 但是被样例误导了TAT BC两点构成了直径 我一开始以为A ...
- 逃学的小孩,树形dp
先找到题 题意: 中文题,没什么好解释的,也没什么歧义. 分析: 首先我们想一下他的路径将会是怎样的:A-B-C/A-C-B,其实就是求一下min(AB+BC,AC+BC),ABC任选.挺简单,首先证 ...
- [BZOJ 1907] 树的路径覆盖 【树形DP】
题目链接:BZOJ - 1907 题目分析 使用树形 DP,f[x][0] 表示以 x 为根的子树不能与 x 的父亲连接的最小路径数(即 x 是一个折线的拐点). f[x][1] 表示以 x 为根的子 ...
- bzoj 4871: [Shoi2017]摧毁“树状图” [树形DP]
4871: [Shoi2017]摧毁"树状图" 题意:一颗无向树,选两条边不重复的路径,删去选择的点和路径剩下一些cc,求最多cc数. update 5.1 : 刚刚发现bzoj上 ...
- BZOJ.4199.[NOI2015]品酒大会(后缀自动机 树形DP)
BZOJ 洛谷 后缀数组做法. 洛谷上SAM比SA慢...BZOJ SAM却能快近一倍... 只考虑求极长相同子串,即所有后缀之间的LCP. 而后缀的LCP在后缀树的LCA处.同差异这道题,在每个点处 ...
- BZOJ.3611.[HEOI2014]大工程(虚树 树形DP)
题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开 ...
随机推荐
- sql 防注入插入
var strsql = "insert into Staff_Answer (ExamTitleID,QuestionsID,MultipleChoice,RightOption,Answ ...
- NIO客户端主要创建过程
NIO客户端主要创建过程: 步骤一:打开SocketChannel,绑定客户端本地地址(可选,默认系统会随机分配一个可用的本地地址),示例代码如下: SocketChannel client ...
- hadoop的安装和配置
hadoop安装 在Apache Hadoop主页的下载页面https://hadoop.apache.org/releases.html选择版本进行下载: 下载下来的是压缩包: 将压缩包使用Xftp ...
- hihocoder1078 线段树的区间修改
思路: 线段树区间更新.注意这里是把一个区间的所有数全部赋值为一个新的值. 实现: #include <bits/stdc++.h> using namespace std; ; ], l ...
- vue下axios和fetch跨域请求
1.在config的index.js下面进行常用跨域配置代码:proxyTable: { '/apis': { //使用"/api"来代替"http://xxxx.cn& ...
- 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)
A (By ggg): 题意:一个人还有x秒到红绿灯,这个红绿灯有g秒绿灯,y秒黄 灯,r秒红灯,问你到红绿灯的时候是什么灯.值得注意的是绿 灯变黄灯时,第g秒是黄灯了. B (By Anxdada) ...
- java-基于泛型和反射机制的通用比较器实现
一.前言 Java的比较器是用来对List集合进行排序用的,分为内部比较器和外部比较器两类 内部比较器:被排序的类要 implements Comparable 类,并实现compareTo方法. 外 ...
- js 数组过滤 filter
let res = this.list.filter(item => routeEqual(this.currentRouteObj, item) || item.name === this.$ ...
- postman的关联,即如何在请求中引用上次请求返回的值
做接口测试,一定会遇到这种情况,需要拿上次请求的值在本次请求中使用,比如,我们去测试一个东西,要去登录才能做其他的操作,需要拿到登录返回数据中的某些字段,比如,token啊等... 如果发一次请求,就 ...
- 如何在一次请求中通过JS中获取Url中的参数
从A跳转到B,携带参数 例如: /pc/B.jsp?item=123456 B页面在js可以直接用 var item='${param.item}'; 这样就拿到啦 还有一种方法 定义一个函数 f ...