题意:给你一颗树,删掉一条边把它变成左右两颗子树,问左右子树直径的乘积最大是多少
题解:枚举边暴力求解即可
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = 210;
int n, dist[N], Max, Index;
bool vis[N], G[N][N];
void bfs(int s){
memset(vis, false, sizeof(vis));
vis[s] = true;
dist[s] = 0;
queue <int> Q;
Q. push(s);
while( Q. size() ){
int p = Q. front();
Q. pop();
for(int i = 1; i <= n; i ++){
if( !G[p][i] )continue;
if( !vis[i] ){
vis[i] = true;
dist[i] = dist[p] + 1;
Q. push(i);
if(dist[i] > Max){
Max = dist[i];
Index = i;
}
}
}
}
}
int main(){
int a[N], b[N];
while(scanf("%d", &n) != EOF){
memset(G, false, sizeof(G));
for(int i = 1; i < n; i ++){
scanf("%d %d", &a[i], &b[i]);
G[a[i]][b[i]] = G[b[i]][a[i]] = true;
}
int Ans = 0;
for(int i = 1; i < n; i ++){
G[a[i]][b[i]] = G[b[i]][a[i]] = false;
memset(dist, 0, sizeof(dist));
Max = Index = 0;
bfs(a[i]);
bfs(Index);
int ans = Max;
memset(dist, 0, sizeof(dist));
Max = Index = 0;
bfs(b[i]);
bfs(Index);
Ans = max(Ans, ans * Max);
G[a[i]][b[i]] = G[b[i]][a[i]] = true;
}
printf("%d\n", Ans);
}
return 0;
}