poj 1986 Distance Queries
好像是模板题 当作练习题 不错; 要求任意两点之间的距离。可以假设一个根节点,然后所有点到根节点的距离,然后求出任意两点多公共祖先; 距离就变成了
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的更多相关文章
- POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 【USACO】距离咨询(最近公共祖先)
POJ 1986 Distance Queries / UESTC 256 Distance Queries / CJOJ 1129 [USACO]距离咨询(最近公共祖先) Description F ...
- POJ.1986 Distance Queries ( LCA 倍增 )
POJ.1986 Distance Queries ( LCA 倍增 ) 题意分析 给出一个N个点,M条边的信息(u,v,w),表示树上u-v有一条边,边权为w,接下来有k个询问,每个询问为(a,b) ...
- POJ 1986 Distance Queries LCA两点距离树
标题来源:POJ 1986 Distance Queries 意甲冠军:给你一棵树 q第二次查询 每次你问两个点之间的距离 思路:对于2点 u v dis(u,v) = dis(root,u) + d ...
- POJ 1986 Distance Queries 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total ...
- POJ 1986 Distance Queries(Tarjan离线法求LCA)
Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 12846 Accepted: 4552 ...
- poj 1986 Distance Queries LCA
题目链接:http://poj.org/problem?id=1986 Farmer John's cows refused to run in his marathon since he chose ...
- 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 ...
- 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 ...
- POJ 1986 Distance Queries(LCA Tarjan法)
Distance Queries [题目链接]Distance Queries [题目类型]LCA Tarjan法 &题意: 输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面 ...
- poj 1986 Distance Queries 带权lca 模版题
Distance Queries Description Farmer John's cows refused to run in his marathon since he chose a pa ...
随机推荐
- 错误 1 无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口
http://www.cnblogs.com/waitingfor/archive/2011/12/19/2293469.html
- NTP服务及时间同步(CentOS6.x)
博客分类: linux 今有一小型项目,完全自主弄,原来以为很简单的NTP服务,我给折腾了2个多小时才整撑头(以前都是运维搞,没太注意,所以这技术的东西,在简单都需要亲尝啊),这里记录为以后别再浪 ...
- fuel openstack 在 VirtualBox 上的部署
搞了两天,终于搞好了.说说过程: 一开始用的6.1版本的Fuel.iso,按照国内外的教程装了几遍,但是网路验证始终不能通过.自己又不是很懂网络.后来在网上看到说6.1版的需要fuel-master连 ...
- MONO常用快捷键
Action Mac OS X Win/Linux 注释代码(//) Cmd + / Ctrl + / 注释代码(/**/) Cmd + Option + / Ctrl + Shift + / 格 ...
- Tomcat打印运行时日志(控制台),访问日志,启动日志
1.sh catlina.sh run以控制台形式输出 2.sever.xml.配置acesslog,设置访问日志输出 Tomcat的访问日志是靠org.apache.catalina.valves. ...
- java隐士类型转换和强制类型转换
,byte和short型在计算时会自动转换为int型计算,结果也是int 型.所以a1*a2的结果是int 型的. byte+byte=int,低级向高级是隐式类型转换,高级向低级必须强制类型转换,b ...
- VS2010/MFC编程入门之五(MFC消息映射机制概述)
VS2010/MFC编程入门之五(MFC消息映射机制概述)-软件开发-鸡啄米 http://www.jizhuomi.com/software/147.html 上一讲鸡啄米为大家简单分析了MFC应用 ...
- 怎么样能让自己的虚拟机上网win7 for linux
我的电脑是win7 32位 虚拟机是linux 我是通过无线连接互联网的 点无线网络连接 右键 点共享 按照我的方式设置 接下来进入 里面会自动的选择这个 如果没有可以自己按照这个设置 接下来进入虚拟 ...
- CentOS下如何查找大文件
在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在Linux系统中,如何去搜索一些比较大的文件呢?下面我整理了一下在Linux系统中如何查找大文件或文件 ...
- Android videoview循环播放视频
如何在一个activity里实现videoview对一个文件夹下的所有视频文件顺序循环播放,当切换界面时暂停, 切换回来继续原来的视频播放呢.所谓的 自动循环播放就是监听到视频播放结束之后继续重新播放 ...