zoukankan      html  css  js  c++  java
  • NC14250 MMSset2(lca)

    这道题只要求出点集的直径,答案就是直径的上取整一半

    #include<iostream>
    #include<algorithm>
    #include<stack>
    #include<vector>
    #include<cstring>
    #include<cstring>
    #include<queue>
    using namespace std;
    typedef long long ll;
    const int N=3e5+10;
    const int mod=1e9+7;
    int depth[N];
    int fa[N][21];
    int pos[N];
    struct node{int v,nxt;}ed[N<<1];
    int head[N],tot;
    void add(int x,int y){ed[++tot]={y,head[x]};head[x]=tot;};
    void dfs(int x,int y){
        fa[x][0]=y;
        for(int i=1;i<=20;i++){
            fa[x][i]=fa[fa[x][i-1]][i-1];
        }
        for(int i=head[x];i;i=ed[i].nxt){
            int v=ed[i].v;
            if(v==y)
                continue;
            depth[v]=depth[x]+1;
            dfs(v,x);
        }
    }
    int lca(int a,int b){
        if(depth[a]<depth[b])
            swap(a,b);
        int i;
        for(i=20;i>=0;i--){
            if(depth[fa[a][i]]>=depth[b]){
                a=fa[a][i];
            }
        }
        if(a==b)
            return a;
        for(i=20;i>=0;i--){
            if(fa[a][i]!=fa[b][i]){
                a=fa[a][i];
                b=fa[b][i];
            }
        }
        return fa[a][0];
    }
    int main(){
         int n;
         cin>>n;
         int i;
         for(i=1;i<n;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            add(u,v);
            add(v,u);
         }
         dfs(1,1);
         int q;
         cin>>q;
         while(q--){
            int num;
            cin>>num;
            int flag=0;
            int u;
            for(i=1;i<=num;i++){
                scanf("%d",&pos[i]);
                if(depth[pos[i]]>flag){
                    flag=depth[pos[i]];
                    u=pos[i];
                }
            }
            int ans=0;
            for(i=1;i<=num;i++){
                int p=lca(u,pos[i]);
                ans=max(ans,depth[u]+depth[pos[i]]-2*depth[p]);
            }
            printf("%d
    ",(ans+1)/2);
         }
    }
    View Code
  • 相关阅读:
    刷脸背后:人脸检测人脸识别人脸检索_张重生资料整理
    webpack工具
    js精度缺失和最大安全整数
    在线文档预览(干货篇)
    讨论js比较两个数组(对象)是否相等的范围
    js不同数据类型中==与===的对比
    js中this的指向
    前后端数据类型
    js网页节点操作
    圆角渐变边框实现
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12588899.html
Copyright © 2011-2022 走看看