题目链接:https://codeforces.com/contest/14/problem/D
枚举删边,把一棵树分成两个联通块,做两次树形dp找树的直径,取最大乘积。
#include <iostream>
#include <cstring>
using namespace std;
static const int MAXN=200+10;
static const int MAXM=200*2+10;
int n;
int h[MAXN],e[MAXM],ne[MAXM],idx;
bool vis[MAXN];
int res,del;
void add(int u,int v) { e[idx]=v,ne[idx]=h[u],h[u]=idx++; }
int dfs(int u,int fa)
{
vis[u]=true;
int dist=0;
int d1=0,d2=0;
for(int i=h[u];~i;i=ne[i])
{
int v=e[i];
if(v==fa || i==del || (i^1)==del) continue;
int t=dfs(v,u)+1;
dist=max(dist,t);
if(t>=d1) d2=d1,d1=t;
else if(t>d2) d2=t;
}
res=max(res,d1+d2);
return dist;
}
int main()
{
memset(h,-1,sizeof(h));
scanf("%d",&n);
int ans=0;
for(int i=0;i<n-1;i++)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
for(del=0;del<idx;del+=2)
{
int temp=1;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
if(!vis[i])
{
res=0;
dfs(i,-1);
temp=temp*res;
}
ans=max(ans,temp);
}
printf("%d\n",ans);
return 0;
}