zoukankan      html  css  js  c++  java
  • 洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking

    P2912 [USACO08OCT]牧场散步Pasture Walking

    lca

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define maxn 1000000
     4 int n,num,m,x,y,z,head[maxn],q,size[maxn],top[maxn],deep[maxn],fa[maxn],dis[maxn];
     5 struct Edge{
     6     int to,next,dis;
     7 }edge[maxn];
     8 
     9 void ins(int u,int v,int d)
    10 {
    11     edge[++num].to=v;
    12     edge[num].next=head[u];
    13     edge[num].dis=d;
    14     head[u]=num;
    15 }
    16 
    17 void dfs(int x)
    18 {
    19     size[x]=1; deep[x]=deep[fa[x]]+1;
    20     for(int i=head[x];i;i=edge[i].next)
    21     {
    22         int v=edge[i].to;
    23         if(fa[x]!=v)
    24         {
    25             fa[v]=x;
    26             dis[v]=dis[x]+edge[i].dis;
    27             dfs(v);
    28             size[x]+=size[v];
    29         }
    30     }
    31 }
    32 
    33 void dfs2(int x)
    34 {
    35     int t=0; if(!top[x]) top[x]=x;
    36     for(int i=head[x];i;i=edge[i].next)
    37     {
    38         int v=edge[i].to;
    39         if(fa[x]!=v&&size[t]<size[v]) t=v;
    40     }
    41     if(t) top[t]=top[x],dfs2(t);
    42     for(int i=head[x];i;i=edge[i].next)
    43     {
    44         int v=edge[i].to;
    45         if(fa[x]!=v&&t!=v) dfs2(v);
    46     }
    47     
    48 }
    49 
    50 int lca(int x,int y)
    51 {
    52     while(top[x]!=top[y])
    53     {
    54         if(deep[top[x]]<deep[top[y]]) swap(x,y);
    55         x=fa[top[x]];
    56     }
    57     return deep[x]<deep[y]?x:y;
    58 }
    59 
    60 int main()
    61 {
    62     scanf("%d%d",&n,&q);
    63     for(int i=1;i<n;i++)
    64         scanf("%d%d%d",&x,&y,&z),ins(x,y,z),ins(y,x,z);
    65     dfs(1); dfs2(1);
    66     while(q--)
    67     {
    68         scanf("%d%d",&x,&y);
    69         printf("%d
    ",dis[x]+dis[y]-(dis[lca(x,y)])*2);
    70     }
    71     return 0;
    72 }
    View Code
  • 相关阅读:
    组合 聚合 依赖 关联
    effective C++ 总结
    重讲设计模式
    宏定义要加括号
    enum hack
    MFC 刷新函数:Invaldate,UpdateWindow,InvaldateRect
    MFC onchar()
    win7系统自带分区工具,能分出逻辑分区
    窗口的创建步骤
    私话编译连接运行过程以及动态库、静态库
  • 原文地址:https://www.cnblogs.com/chen74123/p/7504883.html
Copyright © 2011-2022 走看看