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 ...
随机推荐
- elasticsearch 二、elasticsearch-head安装
简介 elastricsearch-head是用于elasticsearch群集浏览和交互的插件. 源码:https://github.com/mobz/elasticsearch-head (上图来 ...
- Mysql优化-大数据量下的分页策略
一.前言 通常,我们分页时怎么实现呢? 1 SELECT * FROM table ORDER BY id LIMIT 1000, 10; 但是,数据量猛增以后呢? 1 SELECT * FROM t ...
- php -- 类对象调用静态方法
以前一直以为 静态方法的调用:类名::静态方法 非静态方法的调用:类对象->非静态方法 最近研究一个类,发现一个比较奇怪的问题,用“类对象->静态方法”这种方式居然成功的调用了静态方法.很 ...
- Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数)
[转]Windows 性能监视器的基本指标说明(CPU,内存,硬盘参数) 作为一个系统工程师来说,要看懂监控的数据至关重要,关系着优化和分析出现的问题.我是在运维过程中要用到的.因此,今天给出Wind ...
- Ubuntu下安装antlr-4.7.1
简介:antlr工具将语法文件转换成可以识别该语法文件所描述的语言的程序. 例如:给定一个识别json的语法,antlr工具将会根据该语法生成一个程序,该程序可以通过antlr运行库来识别输入的jso ...
- 高并发分布式系统中生成全局唯一(订单号)Id
1.GUID数据因毫无规律可言造成索引效率低下,影响了系统的性能,那么通过组合的方式,保留GUID的10个字节,用另6个字节表示GUID生成的时间(DateTime),这样我们将时间信息与GUID组合 ...
- GCH实践经验
服务器: 终端整机: 办公套件: 杀毒软件: 打印机:
- Relation Extraction中SVM分类样例unbalance data问题解决 -松弛变量与惩罚因子
转载自:http://blog.csdn.net/yangliuy/article/details/8152390 1.问题描述 做关系抽取就是要从产品评论中抽取出描述产品特征项的target短语以及 ...
- css的position中absolute和fixed的区别
fixed:固定定位 absolute:绝对定位 区别很简单: 1.没有滚动条的情况下没有差异 2.在有滚动条的情况下,fixed定位不会随滚动条移动而移动,而absolute则会随滚动条移动 常用场 ...
- Scala 中方法扩展实践
前言 这个名字不知道取得是否合适,简单来说要干的事情就是给某个类型添加一些扩展方法,此场景在各种语言中都会用到,比如 C# 语言,如果我们使用一个别人写好的类库,而又想给某个类库添加一些自己封装的方法 ...