zoukankan      html  css  js  c++  java
  • 【LOJ 10134】Dis

     

    题解:就LCA加上个边权值,不是很难哦

    #include<cstdio>
    #include<iostream>
    #include<cmath>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<queue>
    #include<bits/stdc++.h>
    using namespace std;
    const int N=500002;
    typedef long long ll;
    struct node{
        int next;
        int to;
        int val;
    }e[N*2];
    int n,m,t,z,x,y,a,b,c,d[N],f[N][22];
    int cnt,head[N],we[N];
    void add(int x,int y,int z){
        e[++cnt].to=y;
        e[cnt].next=head[x];
        e[cnt].val=z;
        head[x]=cnt;
    }
    void dfs(int u,int fa){
        d[u]=d[fa]+1;
        for(int i=0;i<=19;i++)
            f[u][i+1]=f[f[u][i]][i];
        for(int i=head[u];i;i=e[i].next){
            int v=e[i].to;
            if(v==fa) continue;
            we[v]=we[u]+e[i].val;
            f[v][0]=u; dfs(v,u);
        }
    }
    int lca(int x,int y){
        if(d[x]<d[y]) swap(x,y);
        for(int i=20;i>=0;i--){
            if(d[f[x][i]]>=d[y]) x=f[x][i];
            if(x==y)  return x;
        }
        for(int i=20;i>=0;i--)
            if(f[x][i]!=f[y][i])
               { x=f[x][i]; y=f[y][i]; }
        return f[x][0];
    }
    int main(){
        freopen("10134.in","r",stdin);
        freopen("10134.out","w",stdout);
        scanf("%d %d",&n,&m);
        for(int i=1;i<n;i++){
            scanf("%d %d %d",&x,&y,&z);
            add(x,y,z); add(y,x,z);
        }
        dfs(1,0);
        for(int i=1;i<=m;i++){
            scanf("%d %d",&x,&y);
            printf("%d
    ",we[x]+we[y]-2*we[lca(x,y)]);
        }
        return 0;
    }
  • 相关阅读:
    Ext.form.FieldSet字段集
    jQuery系列目录
    Ext.form.field.Trigger触发字段
    Ext.grid.Panel表格分页
    ExtJS Model数据实体模型
    Ext.form.field.Spinner微调字段
    Ext.window.MessageBox
    书单
    资料收集
    喧嚣
  • 原文地址:https://www.cnblogs.com/wuhu-JJJ/p/11842962.html
Copyright © 2011-2022 走看看