链接: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;
}