题意:给一颗树 第一问求直径 第二问求有多少条边是所有直径都含有的

题解:求直径就不说了 解第二问需要自己摸索出一些性质

   任意记录一条直径后 跑这条直径的每一个点

   如果以这个点不经过直径能到达最远的距离等于这个点到直径某端点的距离的话

   那么从这个点到直径这一端点的这一条链显然是不满足答案的

   于是我们可以设置两个端点l,r 维护能满足条件的地方

   最后答案就是r - l + 1个端点r - l条边

#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long ll; int n, rt, l, r, num;
int pre[];
int vis[];
int to[];
int val[];
int nex[];
int head[];
int lian[];
ll dis[];
ll diss[];
ll zd, ans1, ans2; void dfs(int x, int fa)
{
int c = head[x];
for(int i = c; i; i = nex[i])
{
int v = to[i];
if(v == fa) continue;
dis[v] = dis[x] + (ll)val[i];
if(dis[v] > zd) zd = dis[v], rt = v;
pre[v] = x;
dfs(v, x);
}
} void chain()
{
int x = rt;
while(x != pre[l])
{
num++;
vis[x] = ;
lian[num] = x;
x = pre[x];
}
} void dfs1(int x, int fa)
{
int c = head[x];
for(int i = c; i; i = nex[i])
{
int v = to[i];
if(v == fa) continue;
if(vis[v]) continue;
diss[v] = diss[x] + (ll)val[i];
if(diss[v] > zd) zd = diss[v];
dfs1(v, x);
}
} int main()
{
scanf("%d", &n);
int cnt = ; zd = ; num = ;
for(int i = ; i < n; i++)
{
int u, v, o; scanf("%d%d%d", &u, &v, &o);
to[++cnt] = v; nex[cnt] = head[u]; head[u] = cnt; val[cnt] = o;
to[++cnt] = u; nex[cnt] = head[v]; head[v] = cnt; val[cnt] = o;
}
dfs(, -);
l = rt; dis[l] = ; zd = ;
pre[l] = -;
dfs(l, -);
r = rt;
ans1 = zd;
chain(); int a1 = , a2 = num;
for(int i = ; i <= num; i++)
{
zd = ;
dfs1(lian[i], -);
if(dis[r] - dis[lian[i]] == zd) a1 = i;
if(zd == dis[lian[i]])
{
a2 = i;
break;
}
}
printf("%lld\n%d\n", ans1, a2 - a1);
return ;
}

BZOJ3124: [Sdoi2013]直径 (树形DP)的更多相关文章

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

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

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

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

  3. [SDOI2013] 直径 - 树形dp

    对于给定的一棵树,其直径的长度是多少,以及有多少条边满足所有的直径都经过该边. Solution 有点意思 先随便求一条直径(两次DFS即可),不妨设为 \(s,t\),我们知道要求的这些边一定都在这 ...

  4. 2014 Super Training #9 E Destroy --树的直径+树形DP

    原题: ZOJ 3684 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3684 题意: 给你一棵树,树的根是树的中心(到其 ...

  5. 算法笔记--树的直径 && 树形dp && 虚树 && 树分治 && 树上差分 && 树链剖分

    树的直径: 利用了树的直径的一个性质:距某个点最远的叶子节点一定是树的某一条直径的端点. 先从任意一顶点a出发,bfs找到离它最远的一个叶子顶点b,然后再从b出发bfs找到离b最远的顶点c,那么b和c ...

  6. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  7. Codeforces 633F 树的直径/树形DP

    题意:有两个小孩玩游戏,每个小孩可以选择一个起始点,并且下一个选择的点必须和自己选择的上一个点相邻,问两个选的点权和的最大值是多少? 思路:首先这个问题可以转化为求树上两不相交路径的点权和的最大值,对 ...

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

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

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

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

随机推荐

  1. linux switch_root

    1 命令格式 switch_root newroot init 跳转到另外一个文件系统,并且把newroot作为新的mount tree,并且执行init程序. 2 特殊要求 newroot必须是一个 ...

  2. 呐喊-Skrik

    尼斯,1892年1月22日,我和两个朋友还在散步,太阳已快下山了,天空突然间变得血一样红,我似乎感受到了一种悲伤忧郁的气息,我止住了脚步,轻轻地倚在篱笆边,极度的疲倦已使我快要窒息了.火焰般的云彩像血 ...

  3. Bing必应地图中国API - 在地图上画圆

    Bing必应地图中国API - 在地图上画圆 2011-05-24 14:49:37|  分类: Bing&Google|字号 订阅     <变形金刚2>上映4日国内票房过亿,基 ...

  4. hihocoder1699

    链接:http://hihocoder.com/problemset/problem/1699 快毕业了的菜菜,做了个比赛,遇到四维偏序,调成了傻逼,所以记录下,看了下以前的傻逼代码,发现自己的cdq ...

  5. js实现IOS上删除app时颤抖动画j函数

    欢迎提供更好的方法! <!--http://www.cnblogs.com/webzhangnan/p/3244920.html --> <html> <head> ...

  6. bzoj4873

    http://www.lydsy.com/JudgeOnline/problem.php?id=4873 最大权闭合子图... 建图: 1.d[i][j]:i->j区间的费用,d[i][j] & ...

  7. 佛祖保佑 永无bug 代码注释

    // // _oo0oo_ // o8888888o // 88" . "88 // (| -_- |) // 0\ = /0 // ___/`---'\___ // .' \\| ...

  8. PCB Genesis或Incam 右键导入TGZ 实现方法

    使用Genesis导入TGZ方式很多 的,比如有:写个脚本框选TGZ的的方式实现TGZ导入,将TGZ拖入脚本界面实现TGZ导入, 给Engineering Toolkit窗口句柄注册拖拽事件实现TGZ ...

  9. Spring中AOP的两种代理方式(Java动态代理和CGLIB代理-转载

    内容是摘抄的,不知最初的原作者,见谅 Java 动态代理.具体有如下四步骤: 通过实现 InvocationHandler 接口创建自己的调用处理器: 通过为 Proxy 类指定 ClassLoade ...

  10. P3343 [ZJOI2015]地震后的幻想乡

    传送门 给积分大佬跪了 再给状压大佬也跪了 //minamoto #include<bits/stdc++.h> #define rint register int #define ll ...