CF14D Two Paths

链接:CF14D Two Paths
题目:

给定一棵树,现在要你在树上找出两条不相交的路径,使得这两条路径长度的乘积最大
2<=n<=200

解决:

枚举点a和a的一个子结点b。
每次搜索a节点所在部分的最长路径(不会经过b点),搜索b节点所在部分的最长路径(不会经过a点)
时间复杂度为O(n^2)
这里找树的最长路径我是用的两边dfs写的

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 210;
int n;
vector<int> g[N];
int maxd, maxv;
void dfs(int x, int father, int dist, int mm)
{
  if (x == mm) return;
  if (x == father) return;
  if (dist > maxd)
  {
    maxd = dist, maxv = x;
  }
  for (int y : g[x])
  {
    if (y == father || y == mm) continue;
    // printf("y = %d, x = %d\n", y, x);
    dfs(y, x, dist + 1, mm);
  }
}
int main()
{
  cin >> n;
  for (int i = 1; i < n; i ++ )
  {
    int a, b; cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  int ans = 0;
  for (int i = 1; i <= n; i ++ )
  {
    if (g[i].size() <= 1) continue;
    for (int j : g[i])
    {
      maxv = j, maxd = 0;
      dfs(j, i, 0, i);
      // puts("---------------------");
      // printf("maxd1 = %d\n", maxd);
      maxd = 0;
      // printf("maxv = %d\n", maxv);
      dfs(maxv, -1, 0, i);
      // puts("=====================");
      int a = maxd;
      // printf("j = %d, i = %d, maxv = %d, maxd = %d\n", j, i, maxv, maxd);
      maxd = 0, maxv = i;
      dfs(i, j, 0, j);
      // puts("++++++++++++++++++++++");
      maxd = 0;
      dfs(maxv, -1, 0, j);
      // puts("/");
      // printf("i = %d, j = %d, maxv = %d, maxd = %d\n", i, j, maxv, maxd);
      // printf("i = %d, j = %d, a = %d, maxd = %d\n", i, j, a, maxd);
      ans = max(ans, a * maxd);
    }
  }
  // maxd = 0;
  // dfs(4, -1, 0, )
  cout << ans << endl;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值