51nod 1694 两条路径(树的直径)

添加链接描述
(本人写题记录一下,故不写题意了(其实就是懒·~))
本题说要求两条没有公共城市的路径乘积最长,根据题意可以知道,只有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值