CF1822F-Problem - F - Codeforces

题目大意:无根树的每条边为k,定义操作:移动根节点为把当前的根ROOT移动到相邻节点,每次代价为c,

定义成本=从ROOT出发到达的最长的路径的长度,利润=成本-代价,求利润最大值

\[\begin{align}
&\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的更多相关文章

  1. 暴力三维树状数组求曼哈顿距离求最值——牛客多校第八场D

    涉及的知识点挺多,但是大多是套路 1.求曼哈顿距离的最值一般对所有情况进行讨论 2.三维树状数组用来求前缀最大值 /* 有一个三维坐标系(x,y,z),取值范围为[1,n],[1,m],[1,h],有 ...

  2. hdoj 2196 Computer【树的直径求所有的以任意节点为起点的一个最长路径】

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  3. POJ 1383 Labyrinth (树的直径求两点间最大距离)

    Description The northern part of the Pyramid contains a very large and complicated labyrinth. The la ...

  4. HDU 4123(树的直径+单调队列)

    Bob’s Race Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  5. tyvj:1520 树的直径 spfa/树的直径

    tyvj:1520 树的直径 Time Limit: 1 Sec  Memory Limit: 131072KiBSubmit: 9619  Solved: 3287 题目连接 http://www. ...

  6. hdu 2196(方法1:经典树形DP+方法2:树的直径)

    Computer Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  7. Tyvj P1520 树的直径

    P1520 树的直径 http://www.tyvj.cn/p/1520 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结 ...

  8. 树的直径初探+Luogu P3629 [APIO2010]巡逻【树的直径】By cellur925

    题目传送门 我们先来介绍一个概念:树的直径. 树的直径:树中最远的两个节点间的距离.(树的最长链)树的直径有两种方法,都是$O(N)$. 第一种:两遍bfs/dfs(这里写的是两遍bfs) 从任意一个 ...

  9. 【模板】tyvjP1520 树的直径 [2017年5月计划 清北学堂51精英班Day3]

    P1520 树的直径 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 树的直径,即这棵树中距离最远的两个结点的距离.每两个相邻的结点的距离为1,即父亲结点与儿 ...

  10. Building Fire Stations ZOJ - 3820 (二分,树的直径)

    大意: 给定树, 求两个点, 使得所有其他的点到两点的最短距离的最大值尽量小. 二分答案转为判定选两个点, 向外遍历$x$的距离是否能遍历完整棵树. 取直径两段距离$x$的位置bfs即可. #incl ...

随机推荐

  1. 使用python脚本玩转古早TCAD软件(待更新)

    前言 TCAD(Technology Computer Aided Design),虽然原名中没有与半导体器件有关的词汇,但这种软件便是半导体工艺模拟及器件模拟的工具,可以说是EDA软件的一种.TCA ...

  2. python allure将生成报告和打开报告写到命令文件,并默认使用谷歌打开

    背景: 使用python + pytest +allure,执行测试用例,并生成测试报告: allure报告要从收集的xml.json等文件,生成报告,不能直接点击报告的index.html,打开的报 ...

  3. 嵌入式ARM端测试手册——全志T3+Logos FPGA开发板(上)

    前 言 本指导文档适用开发环境: Windows开发环境:Windows 7 64bit.Windows 10 64bit Linux开发环境:Ubuntu18.04.4 64bit 虚拟机:VMwa ...

  4. wireshark常用过滤指令

    前言 wireshark是一款高效且免费的网络封包分析软件,现就自己使用过的过滤表达式进行记录,随时更新. 正文 与.或.非指令 与:and && 示例:tcp and ip.src ...

  5. Springboot+Shiro+Mybatis+mysql实现权限安全认证

    Shiro是Apache 的一个强大且易用的Java安全框架,执行身份验证.授权.密码学和会话管理.Shiro 主要分为两个部分就是认证和授权两部分 一.介绍 Subject代表了当前用户的安全操作 ...

  6. Python入门学习介绍

    什么是Python? Python它是一种直译式,面向对象,解释式的脚本语言.它和Java,C/C++,Go语言一样都是高级语言,但由于它是解释式语言,所以运行速度会比Java,C/C++等语言慢(虽 ...

  7. Oracle 启用、禁用触发器

    基本语法 启用指定表中所有触发器(trigger) alter table table_name enable all triggers; 语法: alter table 表名 enable all ...

  8. Vue介绍和使用

    一.Vue介绍 - Vue是一套构建用户界面的渐进式前端框架.- 只关注视图层,并且非常容易学习,还可以很方便的与其它库或已有项目整合.- 通过尽可能简单的API来实现响应数据的绑定和组合的视图组件. ...

  9. MES 与 PLC 的几种交互方式

    在 MES 开发领域,想要从 PLC 获取数据就必须要和 PLC 有信号交互.高效准确的获取 PLC 数据一直是优秀 MES 系统开发的目标之一.初涉相关系统开发的工程师往往不能很好的理解 PLC 和 ...

  10. Django __init__ 方法用于初始化

    使用面向对象的方法来创建一个栈板信息的模型,比如使用 Python 的类来表示栈板信息.以下是一个简单的示例: class Pallet: def __init__(self, number, nam ...