您的位置:首页 > 其它

CodeForces 14D 树的直径 Two Paths

2015-08-14 20:10 267 查看
给出一棵树,找出两条不相交即没有公共点的路径,使得两个路径的长度的乘积最大。

思路:枚举树中的边,将该边去掉,分成两棵树,分别求出这两棵树的直径,乘起来维护一个最大值即可。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int maxn = 200 + 10;

int n;

struct Edge
{
int u, v, nxt;
bool del;
};

int ecnt;
int head[maxn];
Edge edges[maxn * 2];

void AddEdge(int u, int v)
{
edges[ecnt].u = u;
edges[ecnt].v = v;
edges[ecnt].nxt = head[u];
edges[ecnt].del = false;
head[u] = ecnt++;
}

int len, id;

void dfs(int u, int fa, int dep)
{
if(dep > len) { len = dep; id = u; }
for(int i = head[u]; ~i; i = edges[i].nxt)
{
if(edges[i].del) continue;
int v = edges[i].v;
if(v == fa) continue;
dfs(v, u, dep + 1);
}
}

int main()
{
memset(head, -1, sizeof(head));

scanf("%d", &n);
for(int u, v, i = 1; i < n; i++)
{
scanf("%d%d", &u, &v);
AddEdge(u, v); AddEdge(v, u);
}

int ans = 0;

for(int i = 0; i < ecnt; i += 2)
{
int u = edges[i].u, v = edges[i].v;
edges[i].del = true;
edges[i^1].del = true;

int t1, t2;

id = u;
len = 0;
dfs(u, 0, 0);
len = 0;
dfs(id, 0, 0);
t1 = len;

id = v;
len = 0;
dfs(v, 0, 0);
len = 0;
dfs(id, 0, 0);
t2 = len;

ans = max(ans, t1 * t2);
edges[i].del = false;
edges[i^1].del = false;
}

printf("%d\n", ans);

return 0;
}


代码君
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: