POJ 1986 Distance Queries(LCA Tarjan法)
Distance Queries
【题目链接】Distance Queries
【题目类型】LCA Tarjan法
&题意:
输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面的那个字母无视掉,没用的。接着k,下面k个询问lca,输出即可
&题解:
首先看的这个 http://www.cnblogs.com/JVxie/p/4854719.html 大致懂了方法,之后又找了这个代码 http://blog.csdn.net/lianai911/article/details/42300301 就懂了一些.
【时间复杂度】\(O(n+q)\)
&代码:
#include <cstdio>
#include <bitset>
#include <iostream>
#include <set>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <map>
#include <queue>
#include <vector>
using namespace std;
#define INF 0x3f3f3f3f
#define ll long long
#define fo(i,a,b) for(int i=(a);i<=(b);i++)
#define fd(i,a,b) for(int i=(a);i>=(b);i--)
const int maxn = 80000 + 7;
int fa[maxn], Head[maxn], QHead[maxn], Dist[maxn];
struct Edge {
int to, next, w;
} edges[maxn], Qedges[maxn];
int find(int x) { return fa[x] == x ? x : fa[x] = find(fa[x]); }
bool vis[maxn];
void LCA(int u) {
fa[u] = u;
vis[u] = true;
for(int k = Head[u]; k != -1; k = edges[k].next) {
if(!vis[edges[k].to]) {
Dist[edges[k].to] = Dist[u] + edges[k].w;
LCA(edges[k].to);
fa[edges[k].to] = u;
}
}
for(int k = QHead[u]; k != -1; k = Qedges[k].next) {
if(vis[Qedges[k].to]) {
Qedges[k].w = Dist[u] + Dist[Qedges[k].to] - 2 * Dist[find(Qedges[k].to)];
}
}
}
int id, iq;
void ori() {
memset(fa, 0, sizeof(fa));
memset(vis, 0, sizeof(vis));
memset(Head, -1, sizeof(Head));
memset(QHead, -1, sizeof(QHead));
memset(edges, 0, sizeof(edges));
memset(Qedges, 0, sizeof(Qedges));
id = 0;
iq = 0;
}
void Add(int x, int y, int z, int Head[], int& id, Edge edges[]) {
edges[id].to = y;
edges[id].w = z;
edges[id].next = Head[x];
Head[x] = id++;
}
int main() {
freopen("E:1.in", "r", stdin);
int n, m, u, v, w;
char c;
while(~scanf("%d%d", &n, &m)) {
ori();
fo(i, 1, m) {
scanf("%d%d%d %c", &u, &v, &w, &c);
Add(u, v, w, Head, id, edges);
Add(v, u, w, Head, id, edges);
}
scanf("%d", &m);
fo(i, 1, m) {
scanf("%d%d", &u, &v);
Add(u, v, 0, QHead, iq, Qedges);
Add(v, u, 0, QHead, iq, Qedges);
}
LCA(1);
for(int i = 0; i < iq; i += 2)
printf("%d\n", max(Qedges[i].w, Qedges[i + 1].w));
}
return 0;
}
POJ 1986 Distance Queries(LCA Tarjan法)的更多相关文章
- 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(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 (Tarjan算法求最近公共祖先)
题目链接 Description Farmer John's cows refused to run in his marathon since he chose a path much too lo ...
- 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 【输入YY && LCA(Tarjan离线)】
任意门:http://poj.org/problem?id=1986 Distance Queries Time Limit: 2000MS Memory Limit: 30000K Total ...
- 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 ...
随机推荐
- 禅道项目管理系统整合Selenium IDE的思路
前两天说用过Selenium IDE产生了一些想法,这里做一些整理. 传统的测试人员管理测试用例,基本都是用Excel.这没什么不好的,也没什么好的.如果通过管理系统来管理用例,相对来说,少了一些简便 ...
- 微信开发时调用jssdk,在安卓设备中成功调用;在ios设备中返回错误消息:config fail,无其他具体错误消息,且接口权限显示获取ok,无法调用
js代码如下: JavaScript code ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 ...
- linux下从一台服务器复制文件或文件夹到本地
1.从服务器复制文件到本地:scp root@×××.×××.×××.×××:/data/test.txt /home/myfile/ root@×××.×××.×××.××× root是目标服务 ...
- Linux下用gSOAP开发Web Service服务端和客户端程序
网上本有一篇流传甚广的C版本的,我参考来实现,发现有不少问题,现在根据自己的开发经验将其修改,使用无误:另外,补充同样功能的C++版本,我想这个应该更有用,因为能用C++,当然好过受限于C. 1.gS ...
- Vim文档编辑
>##一.vim重复命令 ###1.重复执行上次命令 在普通模式下`.`(小数点)表示重复上一次的命令操作 拷贝测试文件到本地目录 ``` $ ...
- 【译】Apache Kafka支持单集群20万分区
之前网上关于确定Kafka分区数的博客多多少少都源自于饶军大神的文章,如今他带来了这方面的第二篇文章,特此翻译一下,记录一下其中的要点. 原贴地址: https://www.confluent.io/ ...
- 虚拟机---vmmare15安装centos7.4
第一步:下载centos7的镜像iso文件:http://isoredirect.centos.org/centos/7/isos/x86_64/CentOS-7-x86_64-Everything- ...
- nodejs electron 创建桌面应用
//首先安装cnpm npm install -g cnpm --registry=https://registry.npm.taobao.org //使用cnpm进行安装,使用方法和npm相同 cn ...
- A - The Water Problem
In Land waterless, water is a very limited resource. People always fight for the biggest source of w ...
- js中的异步与同步,解决由异步引起的问题
之前在项目中遇到过好多次因为异步引起的变量没有值,所以意识到了认识js中同步与异步机制的重要性 在单线程的js中,异步代码会被放入一个事件队列,等到所有其他代码执行后再执行,而不会阻塞线程. 下面是j ...