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

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

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

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

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

   于是我们可以设置两个端点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. Maven手工安装jar包到本地仓库

    使用maven,少不了的就是要被"包下载失败"这种问题折腾. jar包下载失败后.我们选择手工把jar下载下来.(能够下载到指定jar的途经非常多) 以下随便找了一个jar包为例. ...

  2. 嵌入式开发之8127---DM8127如何利用EDMA搬移数据

    --------------qq:1327706646 ---------------------author:midu -------------------------------datetime ...

  3. Zend Studio如何调试?

    1.安装Zend Studio之前,本机已安装Apache2.如果使用Apache2作为服务器 Window-Preferences-Php-Php Servers 配置好 URL和Server Ro ...

  4. 依赖注入【转自知乎 PHP】

    第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒…… 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 <img src="https://pic1 ...

  5. 开始学习java编程

    先看视屏,学习JAVA语法先,后面再看java web mvc,以及myeclipse http://i.youku.com/u/UMzM4MjMxNjMy/videos 争取20天内进步很大.

  6. JQuery 日期选择框

    一    jeDate日期控件,关于官方的文档请查看: http://www.jayui.com/jedate/ 1 引入js文件 <script type="text/javascr ...

  7. POJ2352 star

    传送门 这道题有个非常好听的名字,求二维偏序! 听起来似乎很高端,但就是让求满足对于每个i,xi < xj && yi < yj的个数. 这道题特别良心,给的顺序都是y递增 ...

  8. bzoj1875 [SDOI2009]HH去散步——矩阵快速幂

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1875 有个限制是不能走回头路,比较麻烦: 所以把矩阵中的元素设成边的经过次数,单向边之间就好 ...

  9. 卸载CentOS7-x64自带的OpenJDK的方法

    第一步:查看并卸载CentOS自带的OpenJDK 安装好的CentOS会自带OpenJdk,用命令 java -version ,会有下面的信息: java version "1.6.0& ...

  10. nodejs常用命令

    npm是一个node包管理和分发工具,已经成为了非官方的发布node模块(包)的标准.有了npm,可以很快的找到特定服务要使用的包,进行下载.安装以及管理已经安装的包. 1.npm install m ...