枚举每一条边 将树分为两部分 分别dfs求出树的直径
从一点开始最长路加次长路为树的直径
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> G[100000];
int n,s;
inline int max(int a,int b)//注意是inline 不然超时
{
return a>b?a:b;
}
int dfs(int v,int x)
{
int max1=0;
int max2=0;
int sum=0;
int i;
for(i=0;i<G[v].size();i++)
{
if(G[v][i]!=x)
{
sum=max(sum,dfs(G[v][i],v));
if(s>max1)
{
max2=max1;
max1=s;
}
else
max2=max(max2,s);
}
}
sum=max(sum,max1+max2);
s=max1+1;
return sum;
}
int main()
{
while(cin>>n)
{
int i,j;
for(i=1;i<=n;i++)
{
G[i].clear();
}
for(i=1;i<n;i++)
{
int s,t;
cin>>s>>t;
G[s].push_back(t);
G[t].push_back(s);
}
int ans=0;
int x=0,y=0;
for(i=1;i<=n;i++)
{
for(j=0;j<G[i].size();j++)
{
s=0;
x=dfs(G[i][j],i);
y=dfs(i,G[i][j]);
ans=max(ans,x*y);
}
}
cout<<ans<<endl;
}
return 0;
}