神奇传送门

好吧,这题很有意思。。

第一眼撇的时候还以为是(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. C# 创建新线程

    首先需要包含命名空间 using System.Threading; 然后创建进程 Thread th = new Thread(new ThreadStart(ThreadMethod)); //创 ...

  2. 笔记-python-lib-contextlib

    笔记-python-lib-contextlib 1.      contextlib with 语句很好用,但不想每次都写__enter_-和__exit__方法: py标准库也为此提供了工具模块c ...

  3. Pythontutor:可视化代码在内存的执行过程

    http://www.pythontutor.com/visualize.html今天去问开发一个Python浅拷贝的问题,开发给了一个神器,可以可视化代码在内存的执行过程,一看即懂,太NB了!~真是 ...

  4. jenkins调用pom.xml文件

    对于测试人员来说,大部分代码维护在本地,因此在用jenkins做持续集成时,我们只需要用Jenkins去直接调用pom.xml文件去执行我们的项目 这里主要是正对创建自由风格的工程来讲解的 一.Jen ...

  5. mac虚拟机上(centos系统)设置联网

    前面介绍了mac安装虚拟机VirtualBox,并在虚拟机上装上了centos,这里在说明一下联网问题. 首先打开centos系统,并输入命令$ ip addr 可得到如下: 发现找不到ip地址,这时 ...

  6. glance上传镜像

    glance image-create --name "centos68-test" --file centos68.dsk \ --disk-format raw --conta ...

  7. HDU 4714 Tree2cycle 找规律

    假设最少删除的边的个数为cost,显然,最终答案即为cost+cost+1 (因为删除一条边,就会增加一个链,所以删除cost条边后,就会有cost+1条链,将这cost+1条链连接起来的代价为cos ...

  8. 团队项目-第四次Scrum 会议

    时间:10.26 时长:30分钟 地点:线上 工作情况 团队成员 已完成任务 待完成任务 解小锐 编写project和projectGenerator类 编写下一步的规格说明 陈鑫 采用creator ...

  9. servlet 图片流

    http://www.cnblogs.com/focusj/archive/2011/04/30/2057577.html https://segmentfault.com/q/10100000004 ...

  10. NativeScript Vue 和 Weex 对比与分析

    Weex Weex是一个项目,由阿里巴巴创造.它的口号是“一次编写,到处运行”,这意味着你可以使用完全相同的代码库构建网站(HTML5),Android和iOS的应用.目前有几个Weex的生产项目,在 ...