MMSet2

MMSet2

https://ac.nowcoder.com/acm/problem/14250

将求树的直径的过程进行模拟即可~

#include <bits/stdc++.h>
using namespace std;
const int N=3e5+50,M=20;
vector<int>v[N];
int dep[N],w[N],f[N][M];
void dfs(int u,int fa)
{
    dep[u]+=dep[fa]+1;
    f[u][0]=fa;
    for(int i=1;i<20;i++)    f[u][i]=f[f[u][i-1]][i-1];
    for(int x:v[u])
    {
        if(x!=fa)    dfs(x,u);
    }
}



int lca(int x,int y)
{
    if(dep[x]<dep[y])    swap(x,y);//假定x的深度更大.
    for(int i=19;i>=0;i--)
    {
        if(dep[f[x][i]]>=dep[y])    x=f[x][i];
    }if(x==y)    return x;
    for(int i=19;i>=0;i--)
    {
        if(f[x][i]!=f[y][i])    x=f[x][i],y=f[y][i];
    }return f[x][0];
}

int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<n;i++)
    {
        int x,y;scanf("%d%d",&x,&y);
        v[x].push_back(y);
        v[y].push_back(x);
    }dfs(1,0);
    int Q;scanf("%d",&Q);
    while(Q--)
    {
        int s,mx=0,point;scanf("%d",&s);
        for(int i=1;i<=s;i++)
        {
            scanf("%d",&w[i]);
            if(dep[w[i]]>mx) point=w[i],mx=dep[w[i]];
        }int ans=0;
        for(int i=1;i<=s;i++)
        {
            ans=max(ans,dep[w[i]]+dep[point]-2*dep[lca(w[i],point)]);
        }ans++;ans/=2;
        printf("%d\n",ans);
    }
    return 0;
}
lpt的小屋 文章被收录于专栏

我想要一份甜甜的爱情

全部评论

相关推荐

10-09 16:23
门头沟学院 Java
点赞 评论 收藏
分享
野猪亨利a:基本上不会有下一步
点赞 评论 收藏
分享
zephory:内容太乱了,根本捕捉不到重点,指导你会的很多,但是看不到具体的强项 个人技能宜精不宜多 项目那块太繁琐了,面试官或者hr只想知道你在项目中看了啥以及具体的收益
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务