http://www.lydsy.com/JudgeOnline/problem.php?id=1602

||

https://www.luogu.org/problem/show?pid=2912

题目描述

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)对奶牛之间的距离。

输入

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

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

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

输出

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

样例输入

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

样例输出

2
7

提示

 

来源

资格赛

练习模板

倍增:

 #include <algorithm>
#include <cstdio> using namespace std; const int N(+);
int n,q,x,y,z;
int dad[N<<][],deep[N<<];
int dis[N<<];
int sumedge,head[N<<];
struct Edge
{
int from,to,next,dis;
Edge(int from=,int to=,int next=,int dis=) :
from(from),to(to),next(next),dis(dis) {}
}edge[N<<]; int add(int from,int to,int dis)
{
edge[++sumedge]=Edge(from,to,head[from],dis);
return head[from]=sumedge;
} void DFS(int x)
{
deep[x]=deep[dad[x][]]+;
for(int i=;dad[x][i];i++)
dad[x][i+]=dad[dad[x][i]][i];
for(int i=head[x];i;i=edge[i].next)
if(!deep[edge[i].to])
{
dad[edge[i].to][]=x;
dis[edge[i].to]=dis[x]+edge[i].dis;
DFS(edge[i].to);
}
} int LCA(int x,int y)
{
if(deep[x]>deep[y]) swap(x,y);
for(int i=;i>=;i--)
if(deep[x]<=deep[dad[y][i]]) y=dad[y][i];
if(x==y) return x;
for(int i=;i>=;i--)
if(dad[x][i]!=dad[y][i])
x=dad[x][i],y=dad[y][i];
return dad[x][];
} int main()
{
scanf("%d%d",&n,&q);
for(int i=;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z); add(y,x,z);
}
DFS();
for(;q;q--)
{
scanf("%d%d",&x,&y);
printf("%d\n",dis[x]+dis[y]-(dis[LCA(x,y)]<<));
}
return ;
}

然后是树剖的~

 #include <algorithm>
#include <cstdio>
#include <vector> using namespace std; const int N(+);
vector< pair<int,int> >vec[N];
int n,q,x,y,z,dis[N];
int dad[N],deep[N],size[N],top[N]; void DFS(int x)
{
size[x]=; deep[x]=deep[dad[x]]+;
for(int i=;i<vec[x].size();i++)
if(dad[x]!=vec[x][i].first)
{
dad[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 DFS_(int x)
{
int t=; if(!top[x]) top[x]=x;
for(int i=;i<vec[x].size();i++)
if(dad[x]!=vec[x][i].first&&size[t]<size[vec[x][i].first]) t=vec[x][i].first;
if(t) top[t]=top[x],DFS_(t);
for(int i=;i<vec[x].size();i++)
if(dad[x]!=vec[x][i].first&&t!=vec[x][i].first) DFS_(vec[x][i].first);
} int LCA(int x,int y)
{
while(top[x]!=top[y])
{
if(deep[top[x]]<deep[top[y]]) swap(x,y);
x=dad[top[x]];
}
if(deep[x]>deep[y]) swap(x,y);
return x;
} int main()
{
scanf("%d%d",&n,&q);
for(int i=;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(); DFS_();
for(;q;q--)
{
scanf("%d%d",&x,&y);
printf("%d\n",dis[x]+dis[y]-dis[LCA(x,y)]*);
}
return ;
}

BZOJ——1602: [Usaco2008 Oct]牧场行走 || 洛谷—— P2912 [USACO08OCT]牧场散步Pasture Walking的更多相关文章

  1. 洛谷P2912 [USACO08OCT]牧场散步Pasture Walking [2017年7月计划 树上问题 01]

    P2912 [USACO08OCT]牧场散步Pasture Walking 题目描述 The N cows (2 <= N <= 1,000) conveniently numbered ...

  2. 洛谷——P2912 [USACO08OCT]牧场散步Pasture Walking(lca)

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

  3. 洛谷 P2912 [USACO08OCT]牧场散步Pasture Walking

    题目描述 The N cows (2 <= N <= 1,000) conveniently numbered 1..N are grazing among the N pastures ...

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

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

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

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

  6. LCA || BZOJ 1602: [Usaco2008 Oct]牧场行走 || Luogu P2912 [USACO08OCT]牧场散步Pasture Walking

    题面:[USACO08OCT]牧场散步Pasture Walking 题解:LCA模版题 代码: #include<cstdio> #include<cstring> #inc ...

  7. BZOJ 1602: [Usaco2008 Oct]牧场行走 倍增裸题

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

  8. BZOJ 1602 [Usaco2008 Oct]牧场行走 dfs

    题意:id=1602">链接 方法:深搜暴力 解析: 这题刚看完还有点意思,没看范围前想了想树形DP,只是随便画个图看出来是没法DP的,所以去看范围. woc我没看错范围?果断n^2暴 ...

  9. BZOJ 1602 USACO2008 Oct 牧场行走

    翻翻吴大神的刷题记录翻到的... 乍一看是一个树链剖分吓瓜我...难不成吴大神14-10-28就会了树剖?orz... 再一看SB暴力都可过... 然后一看直接树上倍增码个就好了... 人生真是充满着 ...

随机推荐

  1. hdu 2435 dinic算法模板+最小割性质

    #include<stdio.h> #include<queue> #include<string.h> using namespace std; #define ...

  2. 百度url 参数详解全

    百度url解析Joe.Smith整理大全 百度url解析Joe.Smith整理大全...1 本文链接:http://blog.csdn.net/qq_26816591/article/details/ ...

  3. linux下sort对中文排序

    http://blog.csdn.net/luoleicn/article/details/6162358 设置: export LC_ALL=C;

  4. 工具-VS CODE快捷键

    快捷键 Ctrl+P 通过文件名或者标签名导航 Ctrl+Tab  在前一个文件和当前文件间切换 F1       打开全局命令 Ctrl+Shift+O will let you navigate ...

  5. 数据操作的封装--sqlhelper

    为了提高软件的灵活性和可维护性,软件的代码须要科学的管理.我们引入了架构这个词.设计模式提醒我们,软件中反复性的代码须要封装起来. 近期在做收费系统时.须要和数据库进行频繁的联系.既然是反复的使用,就 ...

  6. SqlHelper——仅仅由于在人群中多看了你一眼

    一.SqlHelper 出场 不是由于大家都在用SqlHelper所以才用,是由于连接数据库关闭数据库查询数据库的多了也就加上了SqlHelper.当你的非常多需求都有一个同样的方法的时候我们没有必要 ...

  7. Highcharts数据表示(2)

    Highcharts数据表示(2) 数据节点是图表中最小的元素.每一个数据节点都是一个数据单元. 它确定了图表中一个图形元素的各种信息.一个数据节点通常包含下面三类信息: 1.坐标位置信息 因为Hig ...

  8. Oracle 11g 学习3——表空间操作

    一.表空间概述 表空间是Oracle中最大的逻辑存储结构,与操作系统中的数据文件相相应: 基本表空间:一般指用户使用的永久性表空间,用于存储用户的永久性数据          暂时表空间: 主要用于存 ...

  9. intellij idea 运行jedis

    到这里下载 http://mvnrepository.com/ jar包! 将jar包放入项目目录中,并引入! 引入包到项目中!创建对象! package com.company; import re ...

  10. c:forTokens标签delims截取字符

    转自:https://blog.csdn.net/love398146779/article/details/83853958 两个name要相同,在里边内容为空的时候才会全显示. <logic ...