3124: [Sdoi2013]直径
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]直径的更多相关文章
- Bzoj 3124: [Sdoi2013]直径 题解
3124: [Sdoi2013]直径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1222 Solved: 580[Submit][Status] ...
- bzoj 3124: [Sdoi2013]直径
#include<cstdio> #include<iostream> #define M 400009 #define ll long long using namespac ...
- bzoj 3124 [Sdoi2013]直径(dfs)
Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅有N-1 条边. 路径:一 ...
- bzoj千题计划134:bzoj3124: [Sdoi2013]直径
http://www.lydsy.com/JudgeOnline/problem.php?id=3124 第一问: dfs1.dfs2 dfs2中记录dis[i]表示点i距离最长链左端点的距离 第二问 ...
- bzoj3124: [Sdoi2013]直径 树形dp two points
题目链接 bzoj3124: [Sdoi2013]直径 题解 发现所有直径都经过的边 一定在一条直径上,并且是连续的 在一条直径上找这段区间的两个就好了 代码 #include<map> ...
- [洛谷P3304] [SDOI2013]直径
洛谷题目链接:[SDOI2013]直径 题目描述 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节点,可以证明其有且仅 ...
- 【BZOJ3124】[Sdoi2013]直径 树形DP(不用结论)
[BZOJ3124][Sdoi2013]直径 Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵树有N个节 ...
- BZOJ_3124_[Sdoi2013]直径_树形DP
BZOJ_3124_[Sdoi2013]直径_树形DP Description 小Q最近学习了一些图论知识.根据课本,有如下定义.树:无回路且连通的无向图,每条边都有正整数的权值来表示其长度.如果一棵 ...
- 【bzoj3124】 Sdoi2013—直径
http://www.lydsy.com/JudgeOnline/problem.php?id=3124 (题目链接) 题意 求树的直径以及直径的交. Solution 我的想法超麻烦,经供参考..思 ...
随机推荐
- C++ cin不支持录入空格
如果在C++中,用cin>>str;这种方法来接收字符串那么录入的str不能包含空格,否则它会按照空格将整个字符串切分成若干段.如果你要是想输入带空格的字符串那就要用到getline()这 ...
- 多目标规划——fgoalattain
多目标规划 多个目标函数,之间可以用他们的重要程度分析,来一次进行这个序贯算法,当然也可以无限逼近的方案—— clc,clear; % 约束 a = [- - - - ]; b = [- - ]; ...
- ACM-ICPC 2018 徐州赛区网络预赛 A.Hard to prepare 【规律递推】
任意门:https://nanti.jisuanke.com/t/31453 A.Hard to prepare After Incident, a feast is usually held in ...
- 通过sql语句查询出来的结果字段没有到对应实体类时的处理方法
通过sql语句查询出来的结果字段没有到对应实体类时的处理方法,对于Person类获取用户第一个名字和年龄两个字段,常见的有两种方式: 1.在创建一个与查询结果字段对应的类,然后通过构造函数实现: Qu ...
- 如何确定VS编译器版本
_MSC_VER是MSVC编译器的内置宏,定义了编译器的版本,_MSC_VER 值对应版本关系 MSVC++ 11.0 _MSC_VER = 1700 (Visual Studio 2012) MS ...
- 解密Spring加载的Properties文件
Spring的框架中,org.springframework.beans.factory.config.PropertyPlaceholderConfigurer类可以将.properties(key ...
- 全文搜索引擎 Elasticsearch 安装踩坑记录
一.安装 Elastic 需要 Java 8 环境.如果你的机器还没安装 Java 安装完 Java,就可以跟着官方文档安装 Elastic.直接下载压缩包比较简单. $ wget https://a ...
- 使用 Cordova(PhoneGap)构建Android程序
移动终端开发随着智能手机的普及变得越来越热,什么项目都想移动一把,但反观要去学这些各个终端的控件使用,实属不易,又特别是每个终端的控件及所用语言都各不相同,使得这种学习变得更加困难. 有没有一种简单的 ...
- JavaWeb项目中各个文件夹的作用
/WEB-INF/web.xml Web应用程序配置文件,描述了 servlet 和其他的应用组件配置及命名规则. /WEB-INF/classes/ 包含了站点所有用的 class 文件,包括 se ...
- Aspose.cell C# 操作excel(通过批注信息给单元格赋值、批注信息获取公式得出结果并转PNG)
if (fileName == "") return ""; var CurrentRow = 0; Workbook work = new Workbook( ...