添加链接描述
(本人写题记录一下,故不写题意了(其实就是懒·~))
本题说要求两条没有公共城市的路径乘积最长,根据题意可以知道,只有n-1条路,并且数据范围较小,所以可以直接断开一条路径,以这条路径的两个端点(以这两个端点可以保证没有公共城市)进行查找树的直径(就是树的最长距离)最后取最大即可
代码如下
树的直径求解方法
第一遍随意取个点进行bfs查找到距这个点最远的点,其次再进行一次bfs,以最远的点进行bfs,得到的最长距离即为树的直径
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int mod=1e9+7;
const int N=210;
int g[N][N],a[N],b[N];//图小就直接开二维数组存图了
int vis[N],dis[N];
int idex,maxs;
int n;
void bfs(int x)//遍历求距离
{
memset(vis,0,sizeof vis);
dis[x]=0;
vis[x]=1;
queue<int> q;
q.push(x);
while(!q.empty())
{
int a=q.front();
q.pop();
for(int i=1; i<=200; i++)
{
if(!g[a][i])
continue;
if(vis[i])
continue;
vis[i]=1;
dis[i]=dis[a]+1;
q.push(i);
if(maxs<dis[i])
{
maxs=dis[i];
idex=i;
}
}
}
}
int main()
{
cin>>n;
for(int i=1; i<n; i++)
{
cin>>a[i]>>b[i];
g[a[i]][b[i]]=1;
g[b[i]][a[i]]=1;
}
int ans=0;
for(int i=1; i<n; i++)
{
memset(dis,0,sizeof dis);
maxs=0,idex=0;
g[a[i]][b[i]]=0;//断开
g[b[i]][a[i]]=0;
bfs(a[i]);
bfs(idex);
int tmp=maxs;
memset(dis,0,sizeof dis);
maxs=0,idex=0;
bfs(b[i]);
bfs(idex);
ans=max(ans,tmp*maxs);
g[a[i]][b[i]]=1;//连上
g[b[i]][a[i]]=1;
}
cout<<ans<<endl;
return 0;
}