好像是模板题  当作练习题 不错;  要求任意两点之间的距离。可以假设一个根节点,然后所有点到根节点的距离,然后求出任意两点多公共祖先;  距离就变成了

dis[u]+dis[v] - 2*dis[ lca(u,v) ]  非常好的题目

 #include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std; struct date{
int v,val,next;
}edge[];
int N,M,total,head[],dis[];
void add_edge( int u,int v,int val ){
edge[total].v = v;
edge[total].val = val;
edge[total].next = head[u];
head[u] = total++;
}
bool vis[]; int num,sta[],tab[],dep[],dp[][];
void LCA( int son,int deep,int w ){
dep[num] = deep; tab[num] = son; sta[son] = num++; dis[son] = w; vis[son] = true;
for( int i = head[son]; i != -; i = edge[i].next ){
int v = edge[i].v; //cout<<edge[i].val<<endl;
if( !vis[v] )
{ LCA( v,deep+,w+edge[i].val ); dep[num] = deep; tab[num] = son; num++; }
}
//dep[num] = deep; tab[num] = son; num++;
}
int work( int n1,int n2 ){
if( dep[n1] < dep[n2] )return n1;
return n2;
}
void RMQ( ){
for( int i = ; i <= num; i++ )dp[i][] = i;
for( int i = ; (<<i) <= num; i++ )
for( int j = ; j - + (<<i) <= num; j++ )
dp[j][i] = work( dp[j][i-],dp[j+(<<(i-))][i-] );
}
int query( int L,int R )
{
int k = ;
while( (<<(k+)) <= (R-L+) )k++;
return tab[work( dp[L][k],dp[R-(<<k)+][k] )];
}
int main( )
{
int u,v,w; char str[];
while( scanf("%d%d",&N,&M) != EOF )
{
memset( head,-,sizeof(head) ); total = ;
for( int i = ; i <= M; i++ )
{
scanf("%d%d%d%s",&u,&v,&w,&str);
add_edge( u,v,w );
add_edge( v,u,w );
}
memset( vis,,sizeof(vis) );
num = ; LCA( ,, ); num--; RMQ( );
//for( int i = 1; i <= num; i++ )cout<<i<<" "<<dep[i]<<" "<<tab[i]<<endl;
int Q; scanf("%d",&Q);
while( Q-- ){
scanf("%d%d",&u,&v);
//cout<<u<<" "<<v<<" "<<dis[u]<<" "<<dis[v]<<endl;
if( sta[u] > sta[v] )swap( u,v );
int t = query(sta[u],sta[v]);//cout<<endl<<" "<<t<<endl;
//cout<<t<<" "<<dis[1]<<" "<<u<<" "<<v<<" "<<dis[u]<<" "<<dis[v]<<endl;
cout<<dis[u]+dis[v]-*dis[t]<<endl;
}
}
return ;
}

poj 1986 Distance Queries的更多相关文章

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

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

  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 【输入YY && LCA(Tarjan离线)】

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

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

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

  6. poj 1986 Distance Queries LCA

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

  7. 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 ...

  8. 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 ...

  9. POJ 1986 Distance Queries(LCA Tarjan法)

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

  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. 重载和覆盖的区别?(overload vs override)

    override与overload的区别? override 表示重写,overload 表示重载.override是子类和父类之间的关系,是垂直关系:overload是同一个类中方法之间的关系,是水 ...

  2. HDU 1788 Chinese remainder theorem again

    题目链接 题意 : 中文题不详述. 思路 : 由N%Mi=(Mi-a)可得(N+a)%Mi=0;要取最小的N即找Mi的最小公倍数即可. #include <cstdio> #include ...

  3. Linux多线程之同步3

    需求 客户端将需要解决的task发送给服务器,服务器调用线程来解决客户端发送的task,解决完由线程负责将其发送回客户端.(用管道实现通信) 思路 1. server维护两个列表.一是客户端列表.二是 ...

  4. poj 3311(floyd+状态压缩)

    题目链接:http://poj.org/problem?id=3311 思路:Floyd + 状态压缩DP  题意是有N个城市(1~N)和一个PIZZA店(0),要求一条回路,从0出发,又回到0,而且 ...

  5. 正则表达式(RegExp)

    正则表达式(RegExp) 如何按一定规则快速查找到需要找寻的内容,js的设计者们给我们提供了一个叫正则表达式(RegExp对象),专门用于处理类似问题. RegExp对象表示正则表达式,它是对字符串 ...

  6. Markdown语法和MWeb使用说明

    Markdown 语法和 MWeb 写作使用说明 开始写博客,首先熟悉一下Markdown,以前过看GitHub里的README.MD,感受到了这种文字排版的简洁美观. 写博客是一种有效的学习总结和分 ...

  7. QTreeWidget的一个例子,C++语法和item迭代循环都比较巧妙

    学习一下,据说QTreeWidget简单好用,不需要单独设置Model和View,更没有delegate.Signal和Slot应该可以正常使用(未验证,以后补充). #include <QtG ...

  8. [Error]configure: error: Package requirements (fuse >= 2.3 glib-2.0 gthread-2.0) were not met:

    No package 'fuse' found              #sshfs是基于fuse模块的所以要安装fuse No package 'glib-2.0' found No packag ...

  9. Can't find bundle for base name ClientMessages, locale zh_CN

    这是个关于JAVA国际化方面的语音包的问题. 提示这个错误信息就是说找不到代码里写的配置文件. 我这个错误发生在导入一个已经存在的项目时发生的. 解决办法:将配置文件*.properties所在的文件 ...

  10. storage size of ‘oldact’ isn’t known

    #include <signal.h> int main(){struct sigaction act, oldact;return 0;} dies with the message t ...