• hdu 2586 LCA


    思路:裸的LCA

    #include<map>
    #include<set>
    #include<cmath>
    #include<queue>
    #include<cstdio>
    #include<vector>
    #include<string>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define pb push_back
    #define mp make_pair
    #define Maxn 40010
    #define Maxm 80002
    #define LL __int64
    #define Abs(x) ((x)>0?(x):(-x))
    #define lson(x) (x<<1)
    #define rson(x) (x<<1|1)
    #define inf 0x7fffffff
    #define Mod 1000000007
    using namespace std;
    int head[Maxn],vi[Maxn],e,fs[Maxn],fa[Maxn],anc[Maxn],vis[Maxn],dis[Maxn],ans[Maxn];
    struct Edge{
        int u,v,next,val;
    }edge[Maxm];
    vector< pair<int,int> > que[Maxn];
    void init()
    {
        memset(head,-1,sizeof(head));
        memset(vi,0,sizeof(vi));
        memset(vis,0,sizeof(vis));
        memset(fs,0,sizeof(fs));
        memset(dis,0,sizeof(dis));
        for(int i=0;i<Maxn;i++){
            fa[i]=i;
        }
        e=0;
    }
    void add(int u,int v,int val)
    {
        edge[e].u=u,edge[e].v=v,edge[e].val=val,edge[e].next=head[u],head[u]=e++;
        edge[e].u=v,edge[e].v=u,edge[e].val=val,edge[e].next=head[v],head[v]=e++;
    }
    int find(int x)
    {
        if(x!=fa[x])
            fa[x]=find(fa[x]);
        return fa[x];
    }
    void merg(int a,int b)
    {
        int x=find(a);
        int y=find(b);
        if(fs[y]<=fs[x])
            fa[y]=x,fs[x]+=fs[y];
        else fa[x]=y,fs[y]+=fs[x];
    }
    void LCA(int u)
    {
        int i,v,sz;
        sz=que[u].size();
        vi[u]=1;
        anc[u]=u;
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(vi[v]) continue;
            LCA(v);
            merg(u,v);
            anc[find(u)]=u;
        }
        vis[u]=1;
        for(i=0;i<sz;i++){
            v=que[u][i].first;
            if(vis[v]){
                int lca=anc[find(v)];
                int x=que[u][i].second;
                ans[x]=dis[u]+dis[v]-2*dis[lca];
            }
        }
    }
    void dfs(int u)
    {
        int i,v;
        vi[u]=1;
        for(i=head[u];i!=-1;i=edge[i].next){
            v=edge[i].v;
            if(vi[v]) continue;
            dis[v]=dis[u]+edge[i].val;
            dfs(v);
        }
    }
    int main()
    {
        int t,n,m,i,j,u,v,val;
        scanf("%d",&t);
        while(t--){
            init();
            scanf("%d%d",&n,&m);
            for(i=1;i<n;i++){
                scanf("%d%d%d",&u,&v,&val);
                add(u,v,val);
            }
            for(i=1;i<=m;i++){
                scanf("%d%d",&u,&v);
                que[u].pb(mp(v,i));
                que[v].pb(mp(u,i));
            }
            dis[1]=0;
            dfs(1);
            memset(vi,0,sizeof(vi));
            LCA(1);
            for(i=1;i<=m;i++){
                printf("%d
    ",ans[i]);
            }
        }
        return 0;
    }
  • 相关阅读:
    java多线程的基本介绍
    Fragment基本介绍
    TypedValue.applyDimension的使用
    获取当前进程名并判断是否是主进程
    Bitmap类、BitmapFactory及BitmapFactory类中的常用方法
    Android 动态改变图片的颜色值
    Glide4.0使用
    Android在一个app中启动另一个App
    使用Recyclerview实现图片水平自动循环滚动
    Java变量的修饰符
  • 原文地址:https://www.cnblogs.com/wangfang20/p/3297667.html
Copyright © 2020-2023  润新知