【BZOJ】1602: [Usaco2008 Oct]牧场行走(lca)

时间:2022-08-31 20:34:58

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

一开始以为直接暴力最短路,但是n<=1000, q<=1000可能会tle。

显然我没有看到树的性质,树边只有n-1,且一个点一定能到达另一个点

所以我们求出lca,然后记录从根到每个点的距离,然后答案就是d[u]+d[v]-2*d[lca(u, v)]

然后blabla就出来了

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
#define rep(i, n) for(int i=0; i<(n); ++i)
#define for1(i,a,n) for(int i=(a);i<=(n);++i)
#define for2(i,a,n) for(int i=(a);i<(n);++i)
#define for3(i,a,n) for(int i=(a);i>=(n);--i)
#define for4(i,a,n) for(int i=(a);i>(n);--i)
#define CC(i,a) memset(i,a,sizeof(i))
#define read(a) a=getint()
#define print(a) printf("%d", a)
#define dbg(x) cout << #x << " = " << x << endl
#define printarr(a, n, m) rep(aaa, n) { rep(bbb, m) cout << a[aaa][bbb]; cout << endl; }
inline const int getint() { int r=0, k=1; char c=getchar(); for(; c<'0'||c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0'&&c<='9'; c=getchar()) r=r*10+c-'0'; return k*r; }
inline const int max(const int &a, const int &b) { return a>b?a:b; }
inline const int min(const int &a, const int &b) { return a<b?a:b; } const int N=1002;
int lca[N], d[N], fa[N], p[N], ihead[N], vis[N], cnt, n, U[N], V[N];
vector<pair<int, int> > q[N];
struct ED { int to, next, w; } e[N<<1];
void add(int u, int v, int w) {
e[++cnt].next=ihead[u]; ihead[u]=cnt; e[cnt].to=v; e[cnt].w=w;
e[++cnt].next=ihead[v]; ihead[v]=cnt; e[cnt].to=u; e[cnt].w=w;
}
const int ifind(const int &x) { return x==p[x]?x:p[x]=ifind(p[x]); }
void tarjan(const int &x) {
p[x]=x;
for(int i=ihead[x]; i; i=e[i].next) if(e[i].to!=fa[x]) {
fa[e[i].to]=x; tarjan(e[i].to); p[e[i].to]=x;
}
vis[x]=1;
int t=q[x].size();
rep(i, t) if(vis[q[x][i].first]) lca[q[x][i].second]=ifind(q[x][i].first);
}
void dfs(const int &x, const int &sum) {
d[x]=sum;
for(int i=ihead[x]; i; i=e[i].next) if(e[i].to!=fa[x]) dfs(e[i].to, sum+e[i].w);
}
int main() {
read(n); int cs=getint();
int u, v, w;
rep(i, n-1) {
read(u); read(v); read(w);
add(u, v, w);
}
for1(i, 1, cs) {
read(u); read(v);
U[i]=u; V[i]=v;
q[u].push_back(pair<int, int> (v, i));
q[v].push_back(pair<int, int> (u, i));
}
tarjan(n>>1); dfs(n>>1, 0);
for1(i, 1, cs) {
u=U[i], v=V[i];
int lc=lca[i];
printf("%d\n", d[u]+d[v]-(d[lc]<<1));
}
return 0;
}

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

HINT

Source

【BZOJ】1602: [Usaco2008 Oct]牧场行走(lca)的更多相关文章

  1. bzoj 1602 &lbrack;Usaco2008 Oct&rsqb;牧场行走(LCA模板)

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

  2. BZOJ 1602&colon; &lbrack;Usaco2008 Oct&rsqb;牧场行走&lpar; 最短路 &rpar;

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

  3. LCA &vert;&vert; BZOJ 1602&colon; &lbrack;Usaco2008 Oct&rsqb;牧场行走 &vert;&vert; Luogu P2912 &lbrack;USACO08OCT&rsqb;牧场散步Pasture Walking

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

  4. BZOJ——1602&colon; &lbrack;Usaco2008 Oct&rsqb;牧场行走 &vert;&vert; 洛谷—— P2912 &lbrack;USACO08OCT&rsqb;牧场散步Pasture Walking

    http://www.lydsy.com/JudgeOnline/problem.php?id=1602 || https://www.luogu.org/problem/show?pid=2912 ...

  5. BZOJ 1602&colon; &lbrack;Usaco2008 Oct&rsqb;牧场行走 倍增裸题

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

  6. BZOJ 1602 &lbrack;Usaco2008 Oct&rsqb;牧场行走 dfs

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

  7. BZOJ 1602 USACO2008 Oct 牧场行走

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

  8. bzoj 1602&colon; &lbrack;Usaco2008 Oct&rsqb;牧场行走【瞎搞】

    本来想爆手速写个树剖,然而快下课了就手残写了了个n方的短小-- 暴力把查询的两个点中深的一个跳上来,加上边权,然后一起跳加边权就行了 #include<iostream> #include ...

  9. 1602&colon; &lbrack;Usaco2008 Oct&rsqb;牧场行走

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

随机推荐

  1. angularJS(2)

    angularJS(2) 今天先讲一个angularJs的表单绑定实例: <div ng-app="myApp" ng-controller="formCtrl&q ...

  2. tab 切换写法

    <script>        var oUL = document.getElementById('aboutTab-ul');        var oLi = oUL.getElem ...

  3. C&num;性能优化考虑的几个方向

    装箱与拆箱 ArrayList's vs. generic List for primitive types and 64-bits 类型转换   GC 注意SOH对象应该较快,避免内存泄漏 注意LO ...

  4. SpringMVC参数自动绑定

    SpringMVC的各种参数绑定方式 1. 基本数据类型(以int为例,其他类似):Controller代码: @RequestMapping("saysth.do") publi ...

  5. mysql 语句执行顺序问题

    今天在写程序的时候,做分页查找时无意中,将计算数据库查询数量的语句,放到了limit之中,导致出现了bug. 所以发现以下问题: select count(1) from table limit 0, ...

  6. TruSeq 应该指的是试剂盒名字 NEB

    现在中心用的是NEB试剂盒,建库步骤更简单一些.TruSeq和NEB差不多,既可以建DNA又可以建RNA. TruSeq Technology     TruSeq technology repres ...

  7. 10款经典的web前端特效的预览及源码

    1.CSS3响应式导航菜单 今天我给大家介绍一下如何使用纯CSS来实现的一个响应式导航菜单,我们使用的是HTML5+CSS3技术,当浏览器窗口变小或者使用手机浏览器访问的时候,原本横条菜单会收缩成一个 ...

  8. 【CC2530入门教程-04】CC2530的定时&sol;计数器原理与应用

    第4课  CC2530的定时/计数器原理与应用 广东职业技术学院  欧浩源 一.定时/技术器的基本原理 定时/计数器,是一种能够对内部时钟信号或外部输入信号进行计数,当计数值达到设定要求时,向CPU提 ...

  9. 隔离级别简介 (mysql)

    隔离级别:一个事务必须与由其他事务进行的资源或数据更改相隔离的程度.隔离级别从允许的并发副作用(例如,脏读或虚拟读取)的角度进行描述. 定义 编辑 事务指定一个隔离级别,该隔离级别定义一个事务必须与由 ...

  10. bzoj4403 两个串

    Description 兔子们在玩两个串的游戏.给定两个字符串S和T,兔子们想知道T在S中出现了几次, 分别在哪些位置出现.注意T中可能有“?”字符,这个字符可以匹配任何字符. Input 两行两个字 ...