zoukankan      html  css  js  c++  java
  • [bzoj 1602] [Usaco2008 Oct]牧场行走

    求树上两点的距离

    裸LCA 用了倍增

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 const int maxn=1233;
     7 int n,q,cnt;
     8 int last[maxn],deep[maxn],dist[maxn];
     9 int f[maxn][20];
    10 bool vis[maxn];
    11 struct graph{
    12     int to,next,weight;
    13 }e[maxn*2];
    14 void insert(int u,int v,int w){
    15     e[++cnt].to=v;
    16     e[cnt].weight=w;
    17     e[cnt].next=last[u];
    18     last[u]=cnt;
    19 }
    20 void dfs(int x){
    21     vis[x]=1;
    22     for (int i=1;(1<<i)<=deep[x];i++)
    23         f[x][i]=f[f[x][i-1]][i-1];
    24     for (int i=last[x];i;i=e[i].next)
    25         if (!vis[e[i].to]){
    26             int now=e[i].to;
    27             deep[now]=deep[x]+1;
    28             dist[now]=dist[x]+e[i].weight;
    29             f[now][0]=x;
    30             dfs(now);
    31         }
    32 }
    33 int lca(int x,int y){
    34     if (deep[x]<deep[y]) swap(x,y);
    35     int d=deep[x]-deep[y];
    36     for (int i=0;(1<<i)<=d;i++)
    37        if ((1<<i)&d) x=f[x][i];
    38     if (x==y) return x;
    39     for (int i=10;i>=0;i--)
    40       if (f[x][i]!=f[y][i])
    41         x=f[x][i],y=f[y][i];
    42     return f[x][0];
    43 }
    44 int main(){
    45     scanf("%d%d",&n,&q);
    46     memset(dist,0,sizeof(dist));
    47     int u,v,w;
    48     for (int i=1;i<n;i++){
    49         scanf("%d%d%d",&u,&v,&w);
    50         insert(u,v,w),insert(v,u,w);
    51     }
    52     dfs(1);
    53     for (int i=1;i<=q;i++){
    54         scanf("%d%d",&u,&v);
    55         printf("%d
    ",dist[u]+dist[v]-2*dist[lca(u,v)]);
    56     }
    57     return 0;
    58 }
    View Code
  • 相关阅读:
    TP3.2写上下篇
    TP3.2写分页
    TP3.2写提交的验证码验证
    thinkphp5.0学习笔记(四)数据库的操作
    thinkphp5.0学习笔记(三)获取信息,变量,绑定参数
    Windows下用Composer引入官方GitHub扩展包
    glog的安装使用
    实现strStr()函数
    何时将析构函数声明为私有?
    memcpy内存重叠
  • 原文地址:https://www.cnblogs.com/vincent-hwh/p/7358438.html
Copyright © 2011-2022 走看看