CF14D Two Paths题解

题目链接

传送门

题意简述

给定一棵树,找出两条不经过相同点的最长路径,使得他们的长度乘积最大。

题目分析

首先,如果在一棵树上,两条路径没有共同的点,那么这两条路径对应的两个深度更小的端点之间一定有唯一一条路径,我们只需要删掉这条路径上任意一条边,就可以分离这两个路径。

看到两秒的时间限制和 \(n \le 200\) 的数据范围,我们可以想到暴力删除每一条边,在分成的两颗子树中找到直径即可。

关于如何找到直径,有两种方法,请参考oi_wiki中相关内容

此外,在删边找直径时,为了方便,我们可以直接将删掉的边 \(e\) 的两个端点 \(u\) 和 \(v\) 授予子孙关系,这样在 dfs 的时候就不会遍历到另一棵树上了。

代码示例

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define max_n 300
//以下为读入输出优化模板
void read(int &p)
{
p = 0;
int k = 1;
char c = getchar();
while (c < '0' || c > '9')
{
if (c == '-')
{
k = -1;
}
c = getchar();
}
while (c >= '0' && c <= '9')
{
p = p * 10 + c - '0';
c = getchar();
}
p *= k;
return;
}
void write_(int x)
{
if (x < 0)
{
putchar('-');
x = -x;
}
if (x > 9)
{
write_(x / 10);
}
putchar(x % 10 + '0');
}
void writesp(int x)
{
write_(x);
putchar(' ');
}
void writeln(int x)
{
write_(x);
putchar('\n');
}
//以上为读入输出优化模板
//需要开两个记录边的vector,e 在删边时使用,edge 在 dfs 的时候使用
vector<pair<int,int>> e;
vector<int> edge[max_n];
int n;
int dis1[max_n],dis2[max_n];//求树的直径需要用到的辅助数组,dis1[i]为从i开始最长的边,dis2[i]为从i开始第二长的边
int max_d = 0;//记录树的直径
void dfs(int u,int fa)
{
dis1[u] = dis2[u] = 0;//初值都为0
for(auto v:edge[u])//遍历与u相连的每一个点 等价于 for(int i = 0;i<edge[u].size();i++) v = edge[u][i]
{
if(v == fa)
{
continue;
}
dfs(v,u);
int now = dis1[v] +1;//这条路径的长度
if(now>dis1[u])//大于最长路分别更新最长路和次长路
{
dis2[u] = dis1[u];
dis1[u] = now;
}
else if(now > dis2[u])//大于次长路更新次长路
{
dis2[u] = now;
}
} max_d = max(max_d,dis1[u] + dis2[u]);//最后一条经过u的路径的最大长度即为最长路加次长路
}
signed main()
{
//测试用
#if _clang_
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif read(n);
int u,v;
for(int i = 1;i<n;i++)
{
read(u),read(v);
//分别加边
e.push_back({u,v});
edge[u].push_back(v);
edge[v].push_back(u);
}
int d1 = 0,d2 = 0,ans = 0;
for(int i = 1;i<n;i++)
{
//一定要初始化!
memset(dis1,0,sizeof(dis1));
memset(dis2,0,sizeof(dis2));
max_d = 0;
//找e[i-1].first所在子树的直径
dfs(e[i-1].first,e[i-1].second);
d1 = max_d;
////找e[i-1].second所在子树的直径
max_d = 0;
dfs(e[i-1].second,e[i-1].first);
d2 = max_d;
ans = max(ans,d1*d2);
}
writeln(ans);
return 0;
}

CF14D题解的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. Java入门与进阶 P-1.9+P-1.10

    计算机的优先级 所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符.赋值运算符和三目运算符例外,其中,单目运算符.赋值运算符和三目运算符是从右向左结合 ...

  2. 【学习笔记】QT从入门到实战完整版(基础控件)(4)

    添加资源 将存有资源文件的文件夹放到工程目录中,如文件夹名称为 "Image",里面有 Luffy.png 文件. 在 Qt Creator 中右击工程选择[添加新文件]. 在弹出 ...

  3. 一文搞懂工作流审批(Java+activiti)快速开发+自定义工作流配置

    前言 activiti工作流引擎项目,企业erp.oa.hr.crm等企事业办公系统轻松落地,一套完整并且实际运用在多套项目中的案例,满足日常业务流程审批需求. 一.项目形式 springboot+v ...

  4. Node.js学习笔记----day01

    认真学习,认真记录,每天都要有进步呀!!! 加油叭!!! 一.Node.js的简介 Node.js是什么 (1)Node.js不是一门语言 (2) Node.js也不是库,也不是框架 (3)Node. ...

  5. 笔记:C#Quart帮助类 定时器 拿来即用

    using Quartz.Impl; using Quartz.Impl.Triggers; using System; using System.Collections.Generic; using ...

  6. SQL优化的七个方面

    SQL优化的七个方面 1. 创建索引 禁止给表中每一列都建立单独索引 每个Innodb表都必须有一个主键 要注意组合索引的字段顺序 优先考虑覆盖索引 避免使用外键约束 2. 避免索引失效 失效场景: ...

  7. 本地python环境安装kylin项目依赖时报认证错误信息

    问题描述:项目需要连接kylin数据库查询数据,本地安装kylin项目的依赖环境后报认证错误 python版本3.7 32位 pycharm版本 2022版 成功方法: 更换解释器选择无解释器,创建虚 ...

  8. CTF之WEB学习路线规划

    前言 受大佬Lzer0Kx(公众号:LK安全)启发,打算整一篇关于CTF-web的学习路线的分享.当然也算是给一些刚入门的小白的一些学习方向,不至于不知道学啥.废话少说,开整! 以下的所有内容属于我个 ...

  9. JZOJ 5415. 【NOIP2017提高A组集训10.22】公交运输

    题目 城市中有一条长度为 \(n\) 的道路,每隔 \(1\) 的长度有一个公交车站,编号从 \(0\) 到 \(n\),学校在 \(0\) 号车站的位置.其中每个公交车站(除了 \(n\) 号车站) ...

  10. CF1250C Trip to Saint Petersburg

    题目传送门 思路 线段树入门题. 不妨固定一个右端点 \(r\),把所有右端点小于 \(r\) 的区间都在 \(1\) 至此区间的左端点处 update 一个 \(p\),然后每次都给区间 \(1\) ...