计算树上的路径长度。input要去查poj 1984。

任意建一棵树,利用树形结构,将问题转化为u,v,lca(u,v)三个点到根的距离。输出d[u]+d[v]-2*d[lca(u,v)]。

倍增求解:

 #include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define clr(a,m) memset(a,m,sizeof(a))
using namespace std; const int MAXN=;
const int POW = ; struct Edge{
int v,next,c;
Edge(){}
Edge(int _v,int _c,int _next):v(_v),c(_c),next(_next){}
}edge[MAXN<<]; int head[MAXN],tol;
int p[MAXN][POW],d[MAXN];
int vis[MAXN],dis[MAXN];
queue<int>q; void init()
{
tol=;
clr(head,-);
} void add(int u,int v,int c)
{
edge[tol]=Edge(v,c,head[u]);
head[u]=tol++;
} void bfs(int x)
{
clr(vis,);
clr(dis,);
while(!q.empty())
q.pop();
q.push(x);
vis[x]=;
dis[x]=;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(vis[v])
continue;
q.push(v);
vis[v]=;
dis[v]=dis[u]+edge[i].c;
}
}
} void dfs(int u,int fa){
d[u]=d[fa]+;
p[u][]=fa;
for(int i=;i<POW;i++) p[u][i]=p[p[u][i-]][i-];
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].v;
if(v==fa) continue;
dfs(v,u);
}
} int lca( int a, int b ){
if( d[a] > d[b] ) a ^= b, b ^= a, a ^= b;
if( d[a] < d[b] ){
int del = d[b] - d[a];
for( int i = ; i < POW; i++ ) if(del&(<<i)) b=p[b][i];
}
if( a != b ){
for( int i = POW-; i >= ; i-- )
if( p[a][i] != p[b][i] )
a = p[a][i] , b = p[b][i];
a = p[a][], b = p[b][];
}
return a;
} void LCA(int n)
{
clr(p,);
d[]=;
dfs(,); bfs(); int k;
scanf("%d",&k);
int u,v;
rep(i,,k){
scanf("%d%d",&u,&v);
printf("%d\n",dis[u]+dis[v]-*dis[lca(u,v)]);
}
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
init();
rep(i,,m){
int u,v,c;
scanf("%d%d%d%*s",&u,&v,&c);
add(u,v,c);
add(v,u,c);
} LCA(n);
return ;
}

又用tarjin离线做了一遍= =

 #include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define clr(a,m) memset(a,m,sizeof(a))
using namespace std; const int MAXN=; struct Edge{
int v,next,c;
Edge(){}
Edge(int _v,int _c,int _next):v(_v),c(_c),next(_next){}
}edge[MAXN<<]; struct EDGE{
int u,v;
int ans;
EDGE(){}
EDGE(int _u,int _v):u(_u),v(_v),ans(-){}
}; int head[MAXN],tol;
int p[MAXN],vis[MAXN],dis[MAXN]; queue<int>q;
vector<int>query[MAXN];
vector<EDGE>G; void init()
{
tol=;
clr(head,-);
} void add(int u,int v,int c)
{
edge[tol]=Edge(v,c,head[u]);
head[u]=tol++;
} void build(int m)
{
init();
rep(i,,m){
int u,v,c;
scanf("%d%d%d%*s",&u,&v,&c);
add(u,v,c);
add(v,u,c);
} int k;
scanf("%d",&k);
rep(i,,k){
int u,v,siz;
scanf("%d%d",&u,&v); G.push_back(EDGE(u,v));
siz=G.size();
query[u].push_back(siz-); G.push_back(EDGE(v,u));
siz=G.size();
query[v].push_back(siz-);
}
} void bfs(int x)
{
clr(vis,);
clr(dis,);
while(!q.empty())
q.pop();
q.push(x);
vis[x]=;
dis[x]=;
while(!q.empty())
{
int u=q.front();
q.pop();
for(int i=head[u];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(vis[v])
continue;
q.push(v);
vis[v]=;
dis[v]=dis[u]+edge[i].c;
}
}
} int find(int x)
{
return (x==p[x])?x:(p[x]=find(p[x]));
} void dfs(int x)
{
vis[x]=;
for(int i=head[x];i!=-;i=edge[i].next)
{
int v=edge[i].v;
if(vis[v])
continue;
dfs(v);
p[v]=x;
} int siz =query[x].size()-;
rep(i,,siz)
{
int t=query[x][i];
if(vis[G[t].v]){
G[t].ans=find(G[t].v);
}
}
} void LCA(int rt,int n)
{
clr(vis,);
rep(i,,n)
p[i]=i;
dfs(rt);
} void PRT()
{
int siz=G.size();
for(int i=;i<siz;i+=)
{
int u=G[i].u;
int v=G[i].v;
if(G[i].ans!=-)
printf("%d\n",dis[u]+dis[v]-*dis[G[i].ans]);
else
printf("%d\n",dis[u]+dis[v]-*dis[G[i^].ans]);
}
} int main()
{
int n,m;
scanf("%d%d",&n,&m);
build(m);
bfs();
LCA(,n);
PRT();
return ;
}

poj 1986 Distance Queries(LCA:倍增/离线)的更多相关文章

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

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

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

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

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

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

  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-LCA算法]

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

  6. POJ 1986 Distance Queries(LCA Tarjan法)

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

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

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

  8. POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】

    任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS   Memory Limit: 30000K Total ...

  9. poj 1986 Distance Queries(LCA)

    Description Farmer John's cows refused to run in his marathon since he chose a path much too long fo ...

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

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

随机推荐

  1. How to Enable 64-bit Processes for Enhanced Protected Mode in Internet Explorer 11 (IE11)

       Information Enhanced Protected Mode (EPM) adds additional security to Protected Mode and includes ...

  2. Interface Comparator

    int compare(T o1, T o2) Compares its two arguments for order. Returns a negative integer, zero, or a ...

  3. java基础知识回顾之---java StringBuffer,Stringbuilder与String的区别

    public class StringBuilderTest { /** * StringBuffer和Stringbuilder :使用与内容可以被修改的字符串 * 与String的区别:Strin ...

  4. POJ 1125 Stockbroker Grapevine(floyd)

    http://poj.org/problem?id=1125 题意 : 就是说想要在股票经纪人中传播谣言,先告诉一个人,然后让他传播给其他所有的经纪人,需要输出的是从谁开始传播需要的时间最短,输出这个 ...

  5. 用 Xamarin for VS 创建 aar 文件的绑定

    预备工作:相关aar文件,Xamarin for VS一份.我这里以Android中挺火的 MaterialDesignLibrary 为例. 1.首先,创建一个Xamarin Binding Lib ...

  6. pycharm 基础教程

    pycharm 教程(一)安装和首次使用 PyCharm 是我用过的python编辑器中,比较顺手的一个.而且可以跨平台,在macos和windows下面都可以用,这点比较好. 首先预览一下 PyCh ...

  7. 深入理解JVM—字节码执行引擎

    原文地址:http://yhjhappy234.blog.163.com/blog/static/3163283220122204355694/ 前面我们不止一次的提到,Java是一种跨平台的语言,为 ...

  8. 搭建hadoop环境,在win7的eclipse上远程操作(Linux上)hadoop2.6.0出错的一些总结

    问题1:在DFS Lcation 上不能对文件进行操作: 解决方法: 在hadoop上的每个节点上修改该文件 conf/mapred-site.xml,增加: <property> < ...

  9. 解决在windows的eclipse上面运行WordCount程序出现的一系列问题详解

    一.简介 要在Windows下的 Eclipse上调试Hadoop2代码,所以我们在windows下的Eclipse配置hadoop-eclipse-plugin- 2.6.0.jar插件,并在运行H ...

  10. 小米2000万买域名mi.com

    来源:互联网的一些事   移动互联网之下,域名对于企业的吸引力将会越来越低,因为网站的入口多元化,不再仅凭域名.小米用超2000万人民币的代价购买mi.com域名,仅仅是为了所谓的国际化吗?小米此举, ...