给出一棵树,对于每一个询问,给出2个节点,输出2个节点的距离。

输入中有字母,那个是没有用的,不用管。

思路:

0.选择编号为1的节点作为树的root

(注意:有些题的边是单向的,这时候我们要根据节点的入度来确定root,

    双向的话一般可以随意选择一个节点作为root)

1.dfs1,求出dep和pa[i][0]

2.初始化数组pa

3.节点(u,v)的权值为w

 把本来是边的权值w赋给u,v中dep较大的节点,

 cost[i]表示节点i的权值为cost[i]

 先初始化:cost[root]=0

4.dfs2,求每一个节点到root的距离dis[i]

5.查询:dis(u,v)=dis[u]+dis[v]-2*dis[lca(u,v)];

 #include<cstdio>
#include<cstring> using namespace std; const int maxn=+;
const int inf=0x3f3f3f3f; inline int swap(int &x,int &y)
{
x^=y;
y^=x;
x^=y;
} struct Edge
{
int to,next;
};
Edge edge[maxn<<];
int head[maxn];
int tot=;
int cost[maxn];
int dis[maxn];
int pa[maxn][];
int dep[maxn];
int e[maxn][]; void init()
{
memset(head,-,sizeof head);
tot=;
memset(dep,,sizeof dep);
memset(pa,-,sizeof pa);
} void addedge(int u,int v)
{
edge[tot].to=v;
edge[tot].next=head[u];
head[u]=tot++;
} void dfs1(int u)
{
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(!dep[v])
{
dep[v]=dep[u]+;
pa[v][]=u;
dfs1(v);
}
}
} void init_pa(int n)
{
for(int j=;(<<j)<=n;j++)
{
for(int i=;i<=n;i++)
{
if(pa[i][j-]!=-)
pa[i][j]=pa[pa[i][j-]][j-];
}
}
} void dfs2(int u,int pre)
{
for(int i=head[u];~i;i=edge[i].next)
{
int v=edge[i].to;
if(v==pre)
continue;
dis[v]=dis[u]+cost[v];
dfs2(v,u);
}
} int query(int a,int b,int n)
{
int init_a=a;
int init_b=b;
if(dep[a]<dep[b])
swap(a,b);
int cnt;
for(cnt=;dep[a]-(<<cnt)>=;cnt++)
;
cnt--;
for(int j=cnt;j>=;j--)
{
if(dep[a]-(<<j)>=dep[b])
a=pa[a][j];
}
if(a==b)
return dis[init_a]+dis[init_b]-*dis[a];
for(int i=cnt;i>=;i--)
{
if(pa[a][i]!=-&&pa[a][i]!=pa[b][i])
{
a=pa[a][i];
b=pa[b][i];
}
}
return dis[init_a]+dis[init_b]-*dis[pa[a][]];
} void solve(int n)
{
dep[]=;
dfs1();
init_pa(n);
cost[]=;
dis[]=;
for(int i=;i<=n;i++)
{
if(dep[e[i][]]>dep[e[i][]])
swap(e[i][],e[i][]);
cost[e[i][]]=e[i][];
}
dfs2(,-); int m;
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int u,v;
scanf("%d%d",&u,&v);
printf("%d\n",query(u,v,n));
}
return ;
} int main()
{
int n;
while(~scanf("%d",&n))
{
init();
int m;
scanf("%d",&m);
for(int i=;i<=m;i++)
{
int u,v,w;
char ch;
scanf("%d %d %d %c",&e[i][],&e[i][],&e[i][],&ch);
addedge(e[i][],e[i][]);
addedge(e[i][],e[i][]);
}
solve(n);
}
return ;
}

POJ 1986 DIstance Query LCA水题的更多相关文章

  1. POJ 1986 - Distance Queries - [LCA模板题][Tarjan-LCA算法]

    题目链接:http://poj.org/problem?id=1986 Description Farmer John's cows refused to run in his marathon si ...

  2. POJ.1986 Distance Queries ( LCA 倍增 )

    POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...

  3. POJ 1986 Distance Queries LCA两点距离树

    标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...

  4. poj 1986 Distance Queries LCA

    题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...

  5. POJ 1986 Distance Queries(LCA Tarjan法)

    Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...

  6. POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)

    POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...

  7. poj 3080 Blue Jeans(水题 暴搜)

    题目:http://poj.org/problem?id=3080 水题,暴搜 #include <iostream> #include<cstdio> #include< ...

  8. poj 1986 Distance Queries 带权lca 模版题

    Distance Queries   Description Farmer John's cows refused to run in his marathon since he chose a pa ...

  9. POJ 1986 Distance Queries(Tarjan离线法求LCA)

    Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 12846   Accepted: 4552 ...

随机推荐

  1. spark-scheduled调度算法

    1.3源码是如此,后面新版本源码会尽可能的根据用户shell配置的参数进行分配 1.spareadOutApps 尽可能分配到多的机器上面execute和CPU core 2.非spareadouta ...

  2. JAVA基本语义简介

    1.标识符 标识符可以有字母.数字.下划线(_).美元符($)组成,但不能包含@.%.空格等其他特殊符,不能以数字开头. 标识符不能是JAVA关键字和保留字(JAVA预留的关键字,以后的升级版中有可能 ...

  3. 一些基本的C/C++数据类型

    size_t size_t. A basic unsigned integer C/C++ type. It is the type of the result returned by sizeof ...

  4. hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集

    题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值. ...

  5. JVM 虚拟化

    http://www.infoq.com/cn/news/2015/05/java20-multitenant-jvm http://2016.qconshanghai.com/presentatio ...

  6. Js文本溢出自动添加省略号ellipsis

    原文: ellipsis: function(value, len, word) {         //判断value有没有超过指定长度         if (value && v ...

  7. 计算机中丢失 msvcr110.dll 怎么办

    笔者在一次运行 php.exe 时,运到“无法启动此程序,因为计算机中丢失 MSVCR110.dll.尝试重新安装该程序以解决此问题.”的提示,当时很无语,因为系统是刚刚安装好的,而且是最新版本的. ...

  8. fiddler filter 过滤css 图片等

    找到 request header->Show only if yrl contains: REGEX:(?insx)/[^\?/]*\.(css|ico|jpg|png|gif|bmp|wav ...

  9. Box Anemometer

    https://sourceforge.net/projects/pydev/files/pydev/ Eclipse + Pydev 配置Python开发环境 JDK安装http://jingyan ...

  10. R(二): http与R脚本通讯环境安装

    结合实际的工作环境,在开始R研究的时候,首先着手收集的就是能以Web方式发布R运行结果的基础框架,无耐的是,R一直以来常使用于个人电脑的客户端程序上,大家习惯性的下载R安装包,在自己的电脑上安装 -- ...