【树的直径 求树中距离跟阶段点最远的点】CodeForce1822F.md
CF1822F-Problem - F - Codeforces
题目大意:无根树的每条边为k,定义操作:移动根节点为把当前的根ROOT移动到相邻节点,每次代价为c,
定义成本=从ROOT出发到达的最长的路径的长度,利润=成本-代价,求利润最大值
&\huge\color{red}记得开\text{longlong}\\\\\\
& \huge思路\\
& 1.建图 默认根\text{Root}=1,跑一遍dfs 记录每个点到\text{Root}的距离\text{dist}_1{i}\\
& 距离\text{Root}最远的点是c_1 \\
& 如果k\le c,不移动边,因为移动后ans减小 \\
& 否则:以c_1为\text{Root}跑dfs,记\text{dist}_2{i}是到c_1的距离,距离c1最远的点是c_2\\
& 以c_2为\text{Root}跑dfs,记\text{dist}_3{i}是到c_2的距离 \\
& 此时c_1,c_2就是树的直径\\
& 如果可以移动,必然是移动到某个直径\\
&此时的的成本W=\text{max}(\text{dist}_2{i},\text{dist}_3{i}) \times k,代价就是从\text{root}=1到现在的节点的偏移量\text{dist}_1{i}\\
&因此答案Ans = max(Ans,W-c\times\text{dist}_1{i})\\\\\\
&\huge\color{red}记得开\text{longlong}
\end{align}
\]
#include <cstdio>
#include <queue>
#include <deque>
#include <stack>
#include <map>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <vector>
#define ep emplace_back
#define lld long long
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0);
#define vec vector
const int N = 2e5+9;
const int INF = 0x7FFFFFFF; //2147483647
const int inf1 = 0x3f3f3f3f; //1061109567
const int inf2 = 0x7f7f7f7f; //2139062143 memset赋值用
using namespace std;
int head[N],idx=0;
bool vis[N];
struct node{
int to,val,next;
};
node e[N<<1];
int n,m,k,c;
int c1,c2,c3,c4;
int dist1[N],dist2[N],dist3[N];
void add(int u,int v,int val){
e[idx] = {v,val,head[u]};
head[u] = idx++;
}
void clear9(){
memset(head,-1,sizeof(head));
memset(dist1,0,sizeof(dist1));
memset(dist2,0,sizeof(dist2));
memset(dist3,0,sizeof(dist3));
idx=0;
c1=c2=c3=c=0;
}
void bd(){
cin>>n>>k>>c;
for(int i=1 ; i<=n-1 ; ++i){
int u,v;
cin>>u>>v;
add(u,v,1);
add(v,u,1);
}
}
void dfs1(int u,int fa){
for(int i=head[u]; i!=-1 ; i=e[i].next){
int v = e[i].to;
if(v!=fa){
dist1[v] = dist1[u] +1;
if(dist1[v] > dist1[c1])
c1=v;
dfs1(v,u);
}
}
}
void dfs2(int u,int fa){
for(int i=head[u]; i!=-1 ; i=e[i].next){
int v = e[i].to;
if(v!=fa){
dist2[v] = dist2[u] +1;
if(dist2[v] > dist2[c1])
c2=v;
dfs2(v,u);
}
}
}
void dfs3(int u,int fa){
for(int i=head[u]; i!=-1 ; i=e[i].next){
int v =e[i].to;
if(v!=fa){
dist3[v] = dist3[u] +1;
if(dist3[v] > dist3[c1])
c3=v;
dfs3(v,u);
}
}
}
void solve(){
clear9();
bd();
dfs1(1,0);
dfs2(c1,0);
dfs3(c2,0);
//三次dfs
//开longlong可以用 ans去乘以1ll
lld ans=0;
if(k<c){
ans=(lld)dist1[c1]*k;
}
else{
for(int i=1; i<=n;++i){
int dis=max(dist2[i],dist3[i]);
ans = max(ans,(lld)k*(dis)-(lld)c*dist1[i]);
}
}
cout<<ans<<"\n";
};
int main(){
ios;
int T=1;
cin>>T;
while(T--){
solve();
}
return 0;
}
【树的直径 求树中距离跟阶段点最远的点】CodeForce1822F.md的更多相关文章
- 暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场D
涉及的知识点挺多,但是大多是套路 1.求曼哈顿距离的最值一般对所有情况进行讨论 2.三维树状数组用来求前缀最大值 /* 有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有 ...
- hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- POJ 1383 Labyrinth (树的直径求两点间最大距离)
Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...
- HDU 4123(树的直径+单调队列)
Bob’s Race Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- tyvj:1520 树的直径 spfa/树的直径
tyvj:1520 树的直径 Time Limit: 1 Sec Memory Limit: 131072KiBSubmit: 9619 Solved: 3287 题目连接 http://www. ...
- hdu 2196(方法1:经典树形DP+方法2:树的直径)
Computer Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- Tyvj P1520 树的直径
P1520 树的直径 http://www.tyvj.cn/p/1520 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结 ...
- 树的直径初探+Luogu P3629 [APIO2010]巡逻【树的直径】By cellur925
题目传送门 我们先来介绍一个概念:树的直径. 树的直径:树中最远的两个节点间的距离.(树的最长链)树的直径有两种方法,都是$O(N)$. 第一种:两遍bfs/dfs(这里写的是两遍bfs) 从任意一个 ...
- 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]
P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...
- Building Fire Stations ZOJ - 3820 (二分,树的直径)
大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...
随机推荐
- mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索
mysql 联合表查询从表即使有索引依然ALL的一个原因-索引ALL解决,字符编码方式不一致导致全表搜索那就是主表和从表的关联字段的编码方式不一样!!! 产生的现象: 解决之后,正确的使用了t2.or ...
- C# 循环枚举
foreach (int eemun in Enum.GetValues(typeof(类名))) { string sName = Enum.GetName(typeof(类名), eemun);/ ...
- arm linux 移植 iperf3
背景 新做的硬件需要有进行一些板级接口测试:关于网络的测试很多时候只是停留在 ping 通:能够使用就算了.不知道网络的丢包率,也不知道网络吞吐的性能. 因此,需要使用一些专业化的工具来进行测试:查阅 ...
- arm 移植 lighttpd + CGI 配置
--- title: arm 移植 lighttpd + CGI 配置 EntryName: porting-lighttpd-on-arm-and-make-cgi-config date: 202 ...
- 瑞芯微RK3568J如何“调节主频”,实现功耗降低?一文教会您!
RK3568J主频模式说明 为降低RK3568J功耗,提高运行系统健壮性,在产品现场对RK3568J实现主频调节则显得尤为重要. 图 1 RK3568J官方数据手册主频模式描述 normal模式 根据 ...
- Java 核心基础之static静态代码块和静态方法
static静态代码块和静态方法 static关键字 static修饰的方法或变量,优先于对象执行,所以内存会先有static修饰的内容,后有对象的内容 可以用来修饰类的成员方法.类的成员变量,还可以 ...
- 解决方案 | MiKTex SSL connect error code 35
可能是:你的网络屏蔽了需要连接的网站,更换手机流量热点即可解决
- vscode配置项
因为vscode的默认配置,导致现在用的不是很舒服.总结了以下配置能让你的vscode用着更舒服. 1: 问题: 输入log按tab快速生成代码后,提示居然没了? 解决方案: "editor ...
- django 信号判断是新增、修改还是删除
在Django的信号处理器中,你可以使用一些方法来确定信号是关于新增(create).修改(update)还是删除(delete)的.这通常涉及到检查 created 和 instance 参数的值. ...
- freemarker+minio实现页面静态化
什么是页面静态化? 将原本动态生成的网页内容通过某种形式转化为html并存储在服务器上,当用户请求这些页面时就不需要执行逻辑运算和数据库读 优点: 性能:提高页面加载速度和响应速度,还可以减轻数据库. ...