题意:给定n个点,下面n-1行 u , v ,dis 表示一条无向边和边权值,这里给了一颗无向树

下面m表示m个询问,问 u v n 三点最短距离

典型的LCA转RMQ

#include<stdio.h>
#include<string.h>
#include<math.h>
#define N 100000
#define INF 1<<29
#define Logo 17
using namespace std; inline int Min(int a,int b){return a>b?b:a;} struct node{
int f,to,dis,nex;
}edge[N];
int edgenum,head[N],dis[N];
int E[N*2],R[N],D[N*2],en;//LCA
int ST[N*2][Logo]; void addedge(int u,int v,int dis){
edge[edgenum].f=u; edge[edgenum].to=v;
edge[edgenum].dis=dis; edge[edgenum].nex=head[u];
head[u]=edgenum++;
}
void makeRmqIndex(int n,int b[]) //返回最小值对应的下标
{
int i,j;
for(i=0;i<n;i++)
ST[i][0]=i;
for(j=1;(1<<j)<=n;j++)
for(i=0;i+(1<<j)-1<n;i++)
ST[i][j]=b[ST[i][j-1]] < b[ST[i+(1<<(j-1))][j-1]]? ST[i][j-1]:ST[i+(1<<(j-1))][j-1];
}
int LCA(int s,int v,int b[]) //这里返回的是最小值的 D中的下标(和E中下标一样)
{
s=R[s],v=R[v];
int k; if(s>v){k=s;s=v;v=k;}
k=(int)(log((v-s+1)*1.0)/log(2.0));
return b[ST[s][k]]<b[ST[v-(1<<k)+1][k]]? E[ST[s][k]]:E[ST[v-(1<<k)+1][k]];
} void DFS(int x,int deep){
E[en]=x;D[en]=deep; R[x]=en++; for(int i=head[x];i!=-1;i=edge[i].nex){
int v=edge[i].to;
if(R[v]==-1)
{
dis[v]=dis[x]+edge[i].dis;
DFS(v,deep+1);
E[en]=x; D[en++]=deep;
}
}
} void Input(int n){
memset(head,-1,sizeof(head));
edgenum=0;
while(--n)
{
int u,v,dis; scanf("%d %d %d",&u,&v,&dis);
addedge(u,v,dis);
addedge(v,u,dis);
}
memset(R,-1,sizeof(R));
en=0;
dis[0]=0;
} int main(){
int n,i,que,first=0;
while(~scanf("%d",&n)){
if(first++)printf("\n");
Input(n);
DFS(0,0);
makeRmqIndex(en,D);
scanf("%d",&que);
while(que--)
{
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
int ans=dis[a]+dis[b]+dis[c]-(dis[LCA(a,c,D)]+dis[LCA(b,c,D)]+dis[LCA(a,b,D)]);
printf("%d\n",ans);
}
}
return 0;
}

ZOJ 3195 Design the city LCA转RMQ的更多相关文章

  1. ZOJ 3195 Design the city (LCA 模板题)

    Cerror is the mayor of city HangZhou. As you may know, the traffic system of this city is so terribl ...

  2. zoj 3195 Design the city LCA Tarjan

    题目链接 : ZOJ Problem Set - 3195 题目大意: 求三点之间的最短距离 思路: 有了两点之间的最短距离求法,不难得出: 对于三个点我们两两之间求最短距离 得到 d1 d2 d3 ...

  3. zoj 3195 Design the city lca倍增

    题目链接 给一棵树, m个询问, 每个询问给出3个点, 求这三个点之间的最短距离. 其实就是两两之间的最短距离加起来除2. 倍增的lca模板 #include <iostream> #in ...

  4. ZOJ Design the city LCA转RMQ

    Design the city Time Limit: 1 Second      Memory Limit: 32768 KB Cerror is the mayor of city HangZho ...

  5. zoj——3195 Design the city

    Design the city Time Limit: 1 Second      Memory Limit: 32768 KB Cerror is the mayor of city HangZho ...

  6. ZOJ 3195 Design the city 题解

    这个题目大意是: 有N个城市,编号为0~N-1,给定N-1条无向带权边,Q个询问,每个询问求三个城市连起来的最小权值. 多组数据 每组数据  1 < N < 50000  1 < Q ...

  7. ZOJ - 3195 Design the city

    题目要对每次询问将一个树形图的三个点连接,输出最短距离. 利用tarjan离线算法,算出每次询问的任意两个点的最短公共祖先,并在dfs过程中求出离根的距离.把每次询问的三个点两两求出最短距离,这样最终 ...

  8. [zoj3195]Design the city(LCA)

    解题关键:求树上三点间的最短距离. 解题关键:$ans = (dis(a,b) + dis(a,c) + dis(b,c))/2$ //#pragma comment(linker, "/S ...

  9. zoj 3195(LCA加强版)

    传送门:Problem 3195 https://www.cnblogs.com/violet-acmer/p/9686774.html 题意: 给一个无根树,有q个询问,每个询问3个点(a,b,c) ...

随机推荐

  1. Repeater上下排序按钮

    aspx代码 <table cellspacing="0" cellpadding="0" width="100%" align=&q ...

  2. linux下编译软件通用方法(memcached为例)

    1)到软件的官网或其他网站下载软件的源码包 2)解压源码包,并切换到源码目录中 3)使用./configure --help查询配置帮助,里面可能会有安装指南(Installation directo ...

  3. 设置sudo不输入密码 sudoers 编辑出错后的补救方法

    一 设置sudo为不需要密码 有时候我们只需要执行一条root权限的命令也要su到root,是不是有些不方便?这时可以用sudo代替.默认新建的用户不在sudo组,需要编辑/etc/sudoers文件 ...

  4. Python argparse

    http://songpengfei.iteye.com/blog/1440158 https://docs.python.org/2/library/argparse.html http://sta ...

  5. dede 首页调用单页->栏目内容

    {dede:sql sql='Select content from dede_arctype where id=47'} [field:content/] {/dede:sql}

  6. AIX系统管理员--第一章笔记

    IBM产品系列 x系类为PC服务器-- e-server x        x表示x-architecture        可自由选择运行环境,windows.linux.unix等    p系类为 ...

  7. vector & array

    private static const NUM_LOOPS:int = 15; public function VectorTest():void { var vector:Vector.<i ...

  8. T-SQL备忘(3):分组合并

    --CREATE TABLE test(code varchar(50), [name] varchar(10),[count] int ) --INSERT test SELECT '001' , ...

  9. 如何在MySql中记录SQL日志

    SQL server有一个sql profiler可以实时跟踪服务器执行的SQL语句,这在很多时候调试错误非常有用.例如:别人写的复杂代码.生产系统.无调试环境.无原代码... ...   查了一下资 ...

  10. Javascript的匿名函数

    一.什么是匿名函数?在Javascript定义一个函数一般有如下三种方式:函数关键字(function)语句:function fnMethodName(x){alert(x);}函数字面量(Func ...