很好的一道treedp,当然也挺烦的
首先不难想到先求出一个直径,然后穷举每条边,看他删除之后直径大小是否会变,变了的话就是必须经过的边
下面我们就要想怎么优化,本人语言表达略差,还是配合程序说吧。

 type node=record
point,next:longint;
cost:int64;
end; var f:array[..] of int64;
pr,fr:array[..,..] of longint;
g,h:array[..,..] of int64;
p:array[..] of longint;
edge:array[..] of node;
v:array[..] of boolean;
i,n,len,ans,x,y,z:longint; procedure add(x,y,z:longint);
begin
inc(len);
edge[len].point:=y;
edge[len].cost:=z;
edge[len].next:=p[x];
p[x]:=len;
end; function max(a,b:int64):int64;
begin
if a>b then exit(a) else exit(b);
end; procedure dp(x:longint);
var i,y:longint;
begin
i:=p[x];
v[x]:=true;
while i<>- do
begin
y:=edge[i].point;
if not v[y] then
begin
dp(y);
f[x]:=max(f[x],f[y]); //f[]表示以x为根的子树中最长的路径长
if g[y,]+edge[i].cost>g[x,] then //维护以x为根走到底最长的3条路径(显然不能有两条路径经过同一个孩子)
//这里要维护3条,因为要考虑删边的时候碰巧干掉了其中一条,如果单纯求树的直径的时候只要维护最长和次长即可)
begin
g[x,]:=g[x,];
fr[x,]:=fr[x,];
g[x,]:=g[x,];
fr[x,]:=fr[x,];
g[x,]:=g[y,]+edge[i].cost;
fr[x,]:=y; //从哪转移来的
end
else if (g[y,]+edge[i].cost>g[x,]) then
begin
g[x,]:=g[x,];
fr[x,]:=fr[x,];
g[x,]:=g[y,]+edge[i].cost;
fr[x,]:=y;
end
else if (g[y,]+edge[i].cost>g[x,]) then
begin
g[x,]:=g[y,]+edge[i].cost;
fr[x,]:=y;
end;
if f[y]>h[x,] then //h维护的是以x为根的子树中最长的2条路径(不经过根)
begin
h[x,]:=h[x,];
pr[x,]:=pr[x,];
h[x,]:=f[y];
pr[x,]:=y; //从哪转移来的
end
else if f[y]>h[x,] then
begin
h[x,]:=f[y];
pr[x,]:=y;
end;
end;
i:=edge[i].next;
end;
f[x]:=max(f[x],g[x,]+g[x,]);
end; procedure dfs(x:longint;l,d:int64); //l表示以x为终点且不是起点x的后辈的最长路径,d表示之前搜索到的不经过x的最长路径
var i,y:longint;
l1,l2,l3:int64;
begin
i:=p[x];
v[x]:=true;
while i<>- do
begin
y:=edge[i].point;
if not v[y] then //大批的分类讨论
begin
l1:=f[y];
if y=pr[x,] then l2:=h[x,]
else l2:=h[x,];
l2:=max(l2,d); if y=fr[x,] then l2:=max(l2,g[x,]+g[x,])
else if y=fr[x,] then l2:=max(l2,g[x,]+g[x,])
else l2:=max(l2,g[x,]+g[x,]); if y=fr[x,] then l3:=g[x,]
else l3:=g[x,];
l2:=max(l2,l+l3);
if max(l1,l2)<f[] then inc(ans);
dfs(y,max(l3,l)+edge[i].cost,l2);
end;
i:=edge[i].next;
end;
end; begin
readln(n);
fillchar(p,sizeof(p),);
for i:= to n- do
begin
readln(x,y,z);
add(x,y,z);
add(y,x,z);
end;
dp();
writeln(f[]);
fillchar(v,sizeof(v),false);
ans:=;
dfs(,,);
writeln(ans);
end.

bzoj3124的更多相关文章

  1. 【bzoj3124】 Sdoi2013—直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 (题目链接) 题意 求树的直径以及直径的交. Solution 我的想法超麻烦,经供参考..思 ...

  2. bzoj3124: [Sdoi2013]直径 树形dp two points

    题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...

  3. BZOJ3124 SDOI2013直径

    本以为必有高论,结果是个思博题.随便找一条直径,最后答案肯定是这条直径上的连续一段,如果某分支长度等于直径上某端的长度这一端都要被剪掉. #include<iostream> #inclu ...

  4. 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)

    [BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...

  5. [bzoj3124] [Sdoi2013]直径

    看了child学长的题解才知道怎么写TAT http://www.cnblogs.com/ctlchild/p/5160272.html 以前不知道直径都是过重心的..代码改着改着就和标程完全一样了Q ...

  6. 2018.11.05 bzoj3124: [Sdoi2013]直径(树形dp)

    传送门 一道sbsbsb树形dpdpdp 第一问直接求树的直径. 考虑第二问问的边肯定在同一条直径上均是连续的. 因此我们将直径记下来. 然后对于直径上的每一个点,dpdpdp出以这个点为根的子树中不 ...

  7. bzoj千题计划134:bzoj3124: [Sdoi2013]直径

    http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...

  8. [BZOJ3124]直径

    Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一 ...

  9. BZOJ3124 [Sdoi2013]直径 【树的直径】

    题目 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一棵树上,任意两个节 ...

随机推荐

  1. easyui-treegrid移除树节点出错

    easyui-treegrid移除树节点出错 >>>>>>>>>>>>>>>>>>>& ...

  2. Java SE (1)之 JFrame 组件 FlowLayout 布局

    package com.sunzhiyan; import java.awt.*; import java.awt.event.*; import javax.swing.*; public clas ...

  3. [Session] SessionHelper---C#操作Session的帮助类 (转载)

    点击下载 SessionHelper.rar 下面是代码大家看一下 这个类主要是关于Session的基本操作比如:1.获取Session值2.设置一个Session的值3.清空所有的Session4. ...

  4. Java的jLinqer包介绍

    1.介绍 熟悉C#的lambda 表达式,想要使用 LINQ 在 Java,是个问题,虽然 Java8用函数式接口已经实现了部分lambda 表达式,但是还是不够灵活. 2.Linqer简介 Linq ...

  5. Struts2单文件上传

    第一步:首先写个上传文件的页面(简单的一个form表单) <html> <head> <meta http-equiv="Content-Type" ...

  6. ipad屏幕旋转后的代理

    - (void)statusBarOrientationChange:(NSNotification *)notification {         UIInterfaceOrientation o ...

  7. iOS-UI控件精讲之UIView

    道虽迩,不行不至:事虽小,不为不成. 相关阅读 1.iOS-UI控件精讲之UIView(本文) 2.iOS-UI控件精讲之UILabel ...待续 UIView是所有UI控件的基类,在布局的时候通常 ...

  8. html-----002

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. js Dom树结构分析

    对Dom数结构的理解,对用js操作html元素有很大的意义 先来看一下下面这段html代码:(这里就以分析body中的元素来解释,因为我们基本所有的操作基本都围绕body标签来做的) <!DOC ...

  10. [设计模式]解释器(Interpreter)之大胆向MM示爱吧

    为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 “我刚写了个小程序,需要你来参与下.”我把MM叫到我的电脑旁,“来把下面这条命令打进去,这是个练习打(Pian)符(ni)号(de)的 ...