大视野   1602: [Usaco2008 Oct]牧场行走

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 1947  Solved: 1021
[Submit][Status][Discuss]

Description

N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草。 这n块土地被n-1条边连接。 奶牛可以在边上行走,第i条边连接第Ai,Bi块牧场,第i条边的长度是Li(1<=Li<=10000)。 这些边被安排成任意两头奶牛都可以通过这些边到达的情况,所以说这是一棵树。 这些奶牛是非常喜欢交际的,经常会去互相访问,他们想让你去帮助他们计算Q(1<=q<=1000)对奶牛之间的距离。

Input

*第一行:两个被空格隔开的整数:N和Q

*第二行到第n行:第i+1行有两个被空格隔开的整数:AI,BI,LI

*第n+1行到n+Q行:每一行有两个空格隔开的整数:P1,P2,表示两头奶牛的编号。

Output

*第1行到第Q行:每行输出一个数,表示那两头奶牛之间的距离。

Sample Input

4 2
2 1 2
4 3 2
1 4 3
1 2
3 2

Sample Output

2
7
 
思路:
对于这道题,我们可以发现,两各节点之间的距离就等于这两点的深度之和减去这两点的lca的深度的两倍
so,这道题我们就转化成求lca的问题了
好废话少说,我们来看看代码吧!
代码:
#include<vector>
#include<cstdlib>
#include<stdio.h>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 10001
using namespace std;
vector<pair<int,int> >vec[N];
int n,m,x,y,z,fa[N],deep[N],top[N],size[N],dis[N];
int lca(int x,int y)
{
       for(;top[x]!=top[y];)
       {
           if(deep[top[x]]<deep[top[y]])
            swap(x,y);
           x=fa[top[x]];
    }
    if(deep[x]>deep[y])
     swap(x,y);
    return x;
}
void dfs(int x)
{
    size[x]=;
    deep[x]=deep[fa[x]]+;
    ;i<vec[x].size();i++)
    {
        if(fa[x]!=vec[x][i].first)
        {
            fa[vec[x][i].first]=x;
            dis[vec[x][i].first]=dis[x]+vec[x][i].second;
            dfs(vec[x][i].first);
            size[x]+=size[vec[x][i].first];
        }
    }
}
void dfs1(int x)
{
    ;
    if(!top[x]) top[x]=x;
    ;i<vec[x].size();i++)
     if(vec[x][i].first!=fa[x]&&size[vec[x][i].first]>size[t])
      t=vec[x][i].first;
    if(t)
    {
        top[t]=top[x];
        dfs1(t);
      }
    ;i<vec[x].size();i++)
     if(vec[x][i].first!=fa[x]&&vec[x][i].first!=t)
      dfs1(vec[x][i].first);
}
int main()
{
    scanf("%d%d",&n,&m);
    ;i<n;i++)
    {
        scanf("%d%d%d",&x,&y,&z);
        vec[x].push_back(make_pair(y,z));
        vec[y].push_back(make_pair(x,z));
    }
    dfs();
    dfs1();
    ;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        printf(*dis[lca(x,y)]);
    }
}

树讲解——牧场行走( lca )的更多相关文章

  1. [BZOJ1602] [Usaco2008 Oct] 牧场行走 (LCA)

    Description N头牛(2<=n<=1000)别人被标记为1到n,在同样被标记1到n的n块土地上吃草,第i头牛在第i块牧场吃草. 这n块土地被n-1条边连接. 奶牛可以在边上行走, ...

  2. 牧场行走(LCA)

    神奇传送门 好吧,这题很有意思.. 第一眼撇的时候还以为是(SPFA)呜.... 然后发现要Q次询问就想到了LCA 但是发现不是求LCA.. 于是想到了一个神奇的定律: 两点的LCA一定在u到v的最短 ...

  3. 树讲解——紧急集合(lca)

    大视野    1787: [Ahoi2008]Meet 紧急集合 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3067  Solved: 1365[ ...

  4. bzoj 1602 [Usaco2008 Oct]牧场行走(LCA模板)

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 379  Solved: 216[Submit][Sta ...

  5. cogs 2450. 距离 树链剖分求LCA最近公共祖先 快速求树上两点距离 详细讲解 带注释!

    2450. 距离 ★★   输入文件:distance.in   输出文件:distance.out   简单对比时间限制:1 s   内存限制:256 MB [题目描述] 在一个村子里有N个房子,一 ...

  6. BZOJ1602: [Usaco2008 Oct]牧场行走

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1084  Solved: 556[Submit][St ...

  7. BZOJ 1602: [Usaco2008 Oct]牧场行走( 最短路 )

    一棵树..或许用LCA比较好吧...但是我懒...写了个dijkstra也过了.. ---------------------------------------------------------- ...

  8. 1602: [Usaco2008 Oct]牧场行走

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MB Submit: 1211  Solved: 616 [Submit][ ...

  9. 【bzoj1602】[Usaco2008 Oct]牧场行走

    1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1793  Solved: 935[Submit][St ...

随机推荐

  1. MySQL中CONCAT()的用法

    MySQL中CONCAT()的用法 在日常开发过程中,特别是在书写接口的时候,经常会遇到字符串拼接的情况,比如在返回图片数据时,数据库里往往存储的是相对路径,而接口里一般是存放绝对地址,这就需要字符串 ...

  2. Python基础——字典(dict)

    由键-值对构建的集合. 创建 dic1={} type(dic1) dic2=dict() type(dic2) 初始化 dic2={'hello':123,'world':456,'python': ...

  3. django知识分支_1

    django知识分支 1.Cookie工作流程: 浏览器向服务器发出请求,服务器接收到浏览器的请求进行处理,服务器设置一个cookie发送给浏览器,浏览器将cookie保存,当需要再次登录的时候,浏览 ...

  4. stm32L0工程建立(HAL+IAR,无cubemx)

    https://files.cnblogs.com/files/CodeWorkerLiMing/STM32HAL%E5%BA%93%E5%AD%A6%E4%B9%A0%E2%80%94%E5%B7% ...

  5. Linux磁盘简介

    为一台服务器添加三块磁盘的体系结构情况 Linux系统中用free  -l 查看磁盘的状况 说明:   1)buffers为写入缓冲区,sync将缓冲区数据写入磁盘,cache为读出缓存. 2)cac ...

  6. SQL_5_子句

    接下来讲到的子句有: WHERE STARTING WITH ORDER BY GROUP BY HAVING WHERE: 使用频率仅次于SELECT和FROM STARTING WITH: 附加于 ...

  7. bash数组操作-定义/初始化/赋值…

    数组:     连续的多个独立内存空间,每个内存空间相当于一个变量     数组元素:数组名+索引         索引:从0开始编号             声明数组:         declar ...

  8. 可持久化treap(FHQ treap)

    FHQ treap 的整理 treap = tree + heap,即同时满足二叉搜索树和堆的性质. 为了使树尽可能的保证两边的大小平衡,所以有一个key值,使他满足堆得性质,来维护树的平衡,key值 ...

  9. HDU 5396 区间DP 数学 Expression

    题意:有n个数字,n-1个运算符,每个运算符的顺序可以任意,因此一共有 (n - 1)! 种运算顺序,得到 (n - 1)! 个运算结果,然后求这些运算结果之和 MOD 1e9+7. 分析: 类比最优 ...

  10. zuul session 不一致的问题

    配置文件: #不加这句话导致session不一致zuul.routes.intelligentsia-authority.sensitiveHeaders = Authorization 过滤器里面 ...