Description

给定一个无向图,含有一定的路。从中找出两个最长的路径(每条路径有一些相通路组成)这两个路径不能经过公共的点,求何时二路径的乘积最大。

本题给出的无向图是一棵树,每边权值为1.

原文翻译应为有n个点,n-1条边,两点之间能够相互到达。

Solution

  • 直径分成两部分得到的两条路径
  • 直径的一部分和另一部分里的最长链

Code

#include <vector>
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
const int N = 100005; namespace { // 此处应该替换为Class Solution
int n, dep[N], fa[N], MxDepP;
int dis[N], cnt, d[N], ind[N];
int L[N], R[N]; std:: vector<int> e[N]; void dfs1(int u, int fath) {
dep[u] = dep[fath] + 1, fa[u] = fath;
for (auto v : e[u])
if (v != fath)
dfs1(v, u);
if (dep[u] > dep[MxDepP])
MxDepP = u;
} void dfs2(int u, int fath) {
for (int v : e[u])
if (v != fath and not ind[v])
dfs2(v, u), dis[u] = std:: max(dis[u], dis[v] + 1);
}
int GetDiameter() {
dfs1(1, 0);
dfs1(MxDepP, 0);
int end = MxDepP;
while(end)
d[++cnt] = end, ind[end] = true, end = fa[end];
}
long long CalcAnswer() {
long long Res = 0;
for (int i = 1; i <= cnt; i += 1) {
dfs2(d[i], 0);
Res = std:: max(Res, 1ll * (dis[d[i]] - 1) * (cnt - 1));
}
int tmp = 0;
for (int i = 1; i <= cnt; i += 1)
L[i] = tmp = std:: max(tmp, i - 2 + dis[d[i - 1]]);
tmp = 0;
for (int i = cnt; i >= 1; i -= 1)
R[i] = tmp = std:: max(tmp, cnt - i + dis[d[i + 1]] - 1);
for (int i = 1; i <= n; i += 1)
Res = std:: max(Res, 1ll * L[i] * R[i - 1]);
return Res;
}
}; int main () {
scanf("%d", &n);
for (int i = 1; i < n; i += 1) {
int u, v;
scanf("%d%d", &u, &v);
e[u].push_back(v), e[v].push_back(u);
}
GetDiameter();
printf("%lld\n", CalcAnswer());
return 0;
}

最新文章

  1. Unity3D重要知识点
  2. WAMPSERVER多站点配置
  3. 夺命雷公狗---node.js---20之项目的构建在node+express+mongo的博客项目5mongodb在项目中实现添加数据
  4. 探索多线程使用同一个数据库connection的后果
  5. ASM 图解
  6. 彻底卸载 RAD Studio 2009/2010/XE+ 的步骤
  7. Qt分析:Qt中的两种定时器(可是QObject为什么要提高定时器呢,没必要啊。。。)
  8. Visual Studio 有哪些好用的插件?
  9. Flex——弹性布局
  10. 我只是想获取access_token而已
  11. 《深入理解JAVA虚拟机》笔记1
  12. Django admin修改密码
  13. Bootstrap常用单词组
  14. c/c++ 数组 数组的引用,指针数组的引用
  15. Linux Oracle bash: &ldquo;sqlplus / as sysdba&rdquo;: command not found 解决方法
  16. 从0移植uboot(三) _编译最小可用uboot
  17. POJ2274 Long Long Message 字符串
  18. 如何安装ipa文件(二)
  19. CodeForces 724G: Xor-matic Number of the Graph
  20. P5282 【模板】快速阶乘算法(多项式运算+拉格朗日插值+倍增)

热门文章

  1. Jquery常用正则验证
  2. BZOJ5286:[HNOI/AHOI2018]转盘——题解
  3. BZOJ2555:SubString——题解
  4. HDOJ(HDU).1016 Prime Ring Problem (DFS)
  5. JQuery选择符的理解与应用
  6. 分享一个JQuery弹出层插件
  7. sudoers文件配置
  8. Jenkins自动化构建系列:01敏捷开发、自动化构建与持续集成
  9. XSS攻击处理方案
  10. C# 生成订单号的几种方式