3124: [Sdoi2013]直径

https://www.lydsy.com/JudgeOnline/problem.php?id=3124

分析:

  所有直径都经过的边,一定都是连续的一段。(画个图,反证一下)

  然后可以求出一条直径后,可以对每个点求出不经过直径到达的最远的距离。

  然后判断一下,找到左边分叉的最后一个,右边分叉的第一个,中间的点就是所有直径都经过的点。

代码:

 #include<bits/stdc++.h>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for (;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ; int head[N], q[N], fa[N], nxt[N<<], to[N<<], Enum;
LL dis[N], dist[N], val[N<<], Len = , Mx = ;
int Root, Qd, Zd, tot;
bool vis[N]; inline void add_edge(int u,int v,int w) {
++Enum; to[Enum] = v; val[Enum] = w; nxt[Enum] = head[u]; head[u] = Enum;
++Enum; to[Enum] = u; val[Enum] = w; nxt[Enum] = head[v]; head[v] = Enum;
} void dfs1(int u,int pa) {
fa[u] = pa;
if (dis[u] > Len) {
Len = dis[u]; Root = u;
}
for (int i=head[u]; i; i=nxt[i]) {
int v = to[i];
if (v == pa) continue;
dis[v] = dis[u] + val[i];
dfs1(v, u);
}
} void dfs2(int u,int pa) {
vis[u] = true;
if (dist[u] > Mx) {
Mx = dist[u]; Root = u;
}
for (int i=head[u]; i; i=nxt[i]) {
int v = to[i];
if (v == pa || vis[v]) continue;
dist[v] = dist[u] + val[i];
dfs2(v, u);
}
} int main() { int n = read();
for (int i=; i<n; ++i) {
int u = read(), v = read(), w = read();
add_edge(u, v, w);
}
dfs1(, );
Len = ; Qd = Root; dis[Qd] = ;
dfs1(Root, );
Zd = Root; for (int i=Zd; i; i=fa[i]) q[++tot] = i, vis[i] = true; int L = tot, R = ;
for (int i=tot; i>=; --i) {
Mx = ;dfs2(q[i], );
if (!Mx) continue;
if (Mx == dis[q[i]]) L = i; // 保证所有直径都经过,左边分叉的最后一个
if (Len - dis[q[i]] == Mx) {R = i; break;} // 右边分叉的第一个
}
cout << Len << "\n" << L - R;
return ;
}

3124: [Sdoi2013]直径的更多相关文章

  1. Bzoj 3124: [Sdoi2013]直径 题解

    3124: [Sdoi2013]直径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1222  Solved: 580[Submit][Status] ...

  2. bzoj 3124: [Sdoi2013]直径

    #include<cstdio> #include<iostream> #define M 400009 #define ll long long using namespac ...

  3. bzoj 3124 [Sdoi2013]直径(dfs)

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

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

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

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

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

  6. [洛谷P3304] [SDOI2013]直径

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

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

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

  8. BZOJ_3124_[Sdoi2013]直径_树形DP

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

  9. 【bzoj3124】 Sdoi2013—直径

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

随机推荐

  1. (转)每天一个linux命令(1):ls命令

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查看linu ...

  2. python:验证客户端链接的合法性与socketserver

    一.验证客户端链接的合法性 from socket import * import hmac,os secret_key=b'linhaifeng bang bang bang' def conn_a ...

  3. 【转】Js中Prototype、__proto__、Constructor、Object、Function关系介绍

    一    Prototype.__proto__与Object.Function关系介绍        Function.Object:Js自带的函数对象.         prototype,每一个 ...

  4. POJ 2365【YY水题】

    题目链接:POJ 2365 Rope Rope Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7488   Accepted ...

  5. iText生成PDF 格式报表

    1.导包 <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artif ...

  6. 【遥感专题系列】微波遥感(三、SAR图像特征)

    SAR是主动式侧视雷达系统,且成像几何属于斜距投影类型.因此SAR图像与光学图像在成像机理.几何特征.辐射特征等方面都有较大的区别.在进行SAR图像处理和应用前,需要了解SAR图像的基本特征. 本文主 ...

  7. Java 的 FileFilter文件过滤,readline读行操作

    package com.cjonline.foundation.evisa; import java.io.BufferedReader; import java.io.File; import ja ...

  8. js中的AJAX

    AJAX:Asynchronous JavaScript and XML.意思就是用JavaScript执行异步网络请求. 如果仔细观察一个Form的提交,你就会发现,一旦用户点击Submit按钮,表 ...

  9. js关于密码框强弱度的提示

    三种密码强度的正则表达式: 较弱:全是数字或全是字母 6-16个字符:/^[0-9]{6,16}$|^[a-zA-Z]{6,16}$/; 中级:数字.26个英文字母 6-16个字符: /^[A-Za- ...

  10. 轻量ORM-SqlRepoEx (四)INSERT、UPDATE、DELETE 语句

    *本文中所用类声明见上一篇博文<轻量ORM-SqlRepoEx (三)Select语句>中Customers类 一.增加记录 1.工厂一个实例仓储 var repository = Rep ...