很好的一道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. 搭建linux环境下jenkins可移植环境

    1:背景 项目领域:android. 项目需求为:建立一个网站用于产品经理(以下称为PM)配置该apk所需服务插件,打包出包(包含:apk,文档,demo等等)给厂商并且记录打包出包等信息. 项目设计 ...

  2. 用数据库管理SERV-U的用户时,如何修改密码及原理

    将serv-u设置成数据库管理用户的前提是先要建立数据源 如何用Serv-U连接ODBC|1.可以在 FTP所在服务器安装一个 SQL Server  数据库,也可以使用论坛自带的数据库.建议在 FT ...

  3. Shell: how to list all db links in oracle DB to generate a flat file (生成dblink列表文件)

    如果数据库里有上百个DATABASE LINK, 而且同时要管理几十套这样的数据库,在日后改数据库用户密码时就要格外注意是否有DB LINK在使用,否则只改了LOCAL DB 的用户密码,没有级连修改 ...

  4. Angularjs总结(四)$on、$emit和$broadcast的使用

    开发中有时候会需要控制器之间的传值操作:下面几个操作可以达到所需, 注:无平级之间的操作 $emit只能向父 controller传递event与data$broadcast只能向子 controll ...

  5. (六)Struts2 国际化

    所有的学习我们必须先搭建好Struts2的环境(1.导入对应的jar包,2.web.xml,3.struts.xml) 第一节:国际化简介 国际化(Internationlization),通俗地讲, ...

  6. CSS 背景

    CSS 背景属性用于定义HTML元素的背景. CSS 属性定义背影效果: background-color background-image background-repeat background- ...

  7. WPF 窗体中的 Canvas 限定范围拖动 鼠标滚轴改变大小

    xaml代码: <Canvas Name="movBg"> <Canvas.Background> <LinearGradientBrush EndP ...

  8. PHP过滤常用标签的正则表达式

    $str=preg_replace("/\s+/", " ", $str); //过滤多余回车 $str=preg_replace("/<[ ] ...

  9. mysql修改字符集 转载

    查看编码:    show variables like 'collation_%';    show variables like 'character_set_%';    修改:    MySQ ...

  10. 《wc》-linux命令五分钟系列之十七

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...