神奇传送门

好吧,这题很有意思。。

第一眼撇的时候还以为是(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++

    1.编写一个程序,显示您的姓名和地址. #include<iostream> using namespace std; int main() { ]; cout << &quo ...

  2. 笔记-git-基础使用

    笔记-git-基础使用 1.      git相关概念 工作区(Working Directory): 就是在电脑里能看到的目录,init后的当前目录就是一个工作区: 版本库(Repository): ...

  3. js调用js的方法

    a.js文件调用b.js文件时,需要在a.js的第一行添加代码 document.write(" <script language=\"javascript\" s ...

  4. JS中调用android和ios系统手机打开相机并可选择相册功能

    编写不易,如有转载,请声明出处: 梦回河口:http://blog.csdn.net/zxc514257857/article/details/57626154 实现android手机打开相机选择相册 ...

  5. JDBC---java与数据库中数据类型的对应关系

    基础数据类型 Java 类型 SQL 类型 int 或 java.lang.Integer INTEGER long 或 java.lang.Long BIGINT short 或 java.lang ...

  6. JQuery方法总结

    JQuery方法总结 Dom: Attribute:(属性) $("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img"). ...

  7. 三层还是DDD,ORM还是Ado.Net,何去何从?

    我本想把这个问题放到博问去,前几次有去博问问过之类的问题,无奈大神们可能都不屑回答别人的低级问题.所以放到随笔里,一方面把自己对ORM.架构的一些看法写下来抛砖引玉,另一方面最主要的是想寻求大神们指指 ...

  8. Git上手:Git扫盲区

    Git 自述Git 是由伟大的电脑程序员Linus Torvalds编写的一个开源的,分布式的版本控制系统软件. Git 核心原理Git 利用底层数据结构,通过指向索引对象的可变指针,保存文件快照. ...

  9. 每天一个Linux命令(10):mv命令

    mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中.source表示源文件或目录,target表示目标文件或目录.如果将一个文件移到一个已经存在的目标文件中,则目标文件的内容将被覆 ...

  10. 【转载】Linux下安装LoadRunner LoadGenerator

    原文地址:[转载]Linux下安装LoadRunner LoadGenerator作者:邱建忠tester LR的负载机安装在linux的理由: 1.windows xp,双核+4G内存,基本上每个v ...