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
  • 相关阅读:
    redis之Scan
    redis之GeoHash
    redis之漏斗限流
    redis之布隆过滤器
    redis之HyperLogLog
    redis位图
    redis延迟队列
    redis分布式锁
    如何安装redis
    社区首款 OAM 可视化平台发布!关注点分离、用户友好、上手难度低
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/12588899.html
Copyright © 2011-2022 走看看