神奇传送门

好吧,这题很有意思。。

第一眼撇的时候还以为是(SPFA)呜。。。。

然后发现要Q次询问就想到了LCA

但是发现不是求LCA。。

于是想到了一个神奇的定律:

两点的LCA一定在u到v的最短路上。。

并且也一定在两点与根节点的路上。

所以用dis[a]+dis[b]-2*dis[LCA(a,b)]就得到答案啦!

这道题有一个坑点!注意!

我们先来看一个测试:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int x,y;
scanf("%d%d",&x,&y);
int k1=(int)(log(y-x+1.0)/log(2.0));
int k2=;
while(<<(k2+)<=y-x+)k2++;
printf("%d %d",k1,k2);
}

这看起来是等价的。。但是。。

输入:1 8

输出:2      3

恩,你没有看错,就是2、3.

事实是这样的:C++ 计算log(8)/log(2)时,得到的答案为(double)2.9999996。

强制转换为int后,变成了2;

但是这样就可以了QAQ

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main(){
int num;
int num2;
double k=log(8.0)/log(2.0);
num2=k;
printf("%d",num2);
}

恩,这样就是啦awa

万恶的C++。。。

下面贴代码

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
struct data{
int to,next,value;
}g[];
int head[];
bool qs[];
int id[];
int vs[];
int depth[];
int dp[][];
int dd[];
int dfs_clock=;
int n,q,num=,root;
void ins(int a,int b,int v){
g[++num].next=head[a];
head[a]=num;
g[num].to=b;
g[num].value=v;
}
void dfs(int u,int fa,int d){
id[u]=dfs_clock;
vs[dfs_clock]=u;
depth[dfs_clock++]=d;
for(int i=head[u];i;i=g[i].next)
{
int v=g[i].to;
if(v==fa) continue;
dd[v]=dd[u]+g[i].value;
dfs(v,u,d+);
vs[dfs_clock]=u;
depth[dfs_clock++]=d;
}
}
void RMQ(int nn){
for(int i=;i<=nn;i++)
dp[i][]=i;
for(int j=;(<<j)<=nn;j++)
for(int i=;i+(<<j)-<=nn;i++)
{
int a=dp[i][j-];
int b=dp[i+(<<(j-))][j-];
if(depth[a]<=depth[b])
dp[i][j]=a;
else
dp[i][j]=b;
}
}
int cal(int x,int y){
double k2=log(y-x+1.0)/log(2.0);
int k=k2;
int a=dp[x][k];
int b=dp[y-(<<k)+][k];
if(depth[a]<=depth[b])
return a;
else return b;
}
int lca(int u,int v){
int x=id[u];
int y=id[v];
if(x<y)
return vs[cal(x,y)];
else return vs[cal(y,x)];
}
int main(){
scanf("%d%d",&n,&q);
for(int i=;i<n;i++)
{
int a,b,v;
scanf("%d%d%d",&a,&b,&v);
qs[b]=;
ins(a,b,v);ins(b,a,v);
}
dfs(,,);
RMQ(dfs_clock-);
for(int i=;i<=q;i++)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",dd[a]+dd[b]-*dd[lca(a,b)]);
}
}

不会RMQ的可以看我的传送门

当然,要打树上倍增的也是可以啦。。

代码就不贴了。

真是奇特的题目233~

牧场行走(LCA)的更多相关文章

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

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

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

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

  3. 树讲解——牧场行走( lca )

    大视野   1602: [Usaco2008 Oct]牧场行走 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1947  Solved: 1021[Sub ...

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

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

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

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

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

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

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

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

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1602 一开始以为直接暴力最短路,但是n<=1000, q<=1000可能会tle. 显然 ...

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

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

随机推荐

  1. [BZOJ2427][HAOI2010]软件安装(tarjan+树形DP)

    如果依赖关系出现环,那么对于一个环里的点,要么都选要么都不选, 所以每个环可以当成一个点,也就是强连通分量 然后就可以构造出一颗树,然后树形背包瞎搞一下就行了 注意要搞一个虚拟节点当根节点 Code ...

  2. [Bzoj3991]寻宝游戏(dfs序+set)

    Description 题目链接 Solution 用set按dfs序维护当前的宝物序列,那么答案为相邻2个点的距离加上头尾2个的距离 Code #include <cstdio> #in ...

  3. dubbo的rpc异常

    Exception in thread "main" com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method ...

  4. Weblogic Linux jar包安装

    环境/工具: 系统:CentOS 7 JDK:Oracle JDK fmw_12.2.1.2.0_wls.jar 0x01.新建普通用户weblogic 在Linux环境下建议使用普通用户安装,web ...

  5. 10.2 ajax

    Ajax Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言与服务器进行异步交互 ...

  6. PCB工艺要求

    项目 加工能力 工艺详解   层数 1~6层 层数,是指PCB中的电气层数(敷铜层数).目前嘉立创只接受1~6层板.   板材类型 FR-4板材 板材类型:纸板.半玻纤.全玻纤(FR-4).铝基板,目 ...

  7. css一些事儿

    1. margin和padding 如果边界画一条线,则margin的属于边界外,padding属于边界内 当我们给元素背景色时,margin区域不会被着色,而padding区域会被着色. 当上下两个 ...

  8. centos使用--软件启动关闭等操作的命令

    关于centos服务的命令经常会遇到这几种 service systemctl /etc/init.d/ 1 service和/etc/init.d/ service是一个脚本命令,分析service ...

  9. 树莓派网线连接后通过ssh远程连接

    新安装的树莓派默认是不支持ssh远程连接的,通过PuTTY (64-bit)会提示连接被拒绝. 本文支持笔记本或pc直接通过网线连接树莓派,具体操作步骤如下: 一.确定树莓派的ip地址及是否开启ssh ...

  10. PAT——甲级1042:Shuffling Mashine

    终于做到甲级了 就一个感觉....题目是真的看不懂,亏我还是四六级都过了的人....可是看完题愣是一点都不懂是什么意思. 1042 Shuffling Machine (20 point(s)) Sh ...