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 ...
随机推荐
- Scratch 可能能帮你找到学习编程的初心
Scratch 是MIT 出品的一款少儿编程软件,基于Adobe Air开发,这个运行环境在如今已经显得有些过时,但只要这个软件有用,软件本身就不会过时. 编程的本质大致是调用计算机的指令编写一系列任 ...
- Paxos 实现日志复制同步(Basic Paxos)
Paxos 实现日志复制同步 本篇文章以 John Ousterhout(斯坦福大学教授) 和 Diego Ongaro(斯坦福大学获得博士学位,Raft算法发明人) 在 Youtube 上的讲解视频 ...
- zookeeper入门及使用(二)- 状态查看
查看服务的角色,看Mode字段,有follower及leader [root@c7bit1 bin]# echo stat | nc 127.0.0.1 2181 Zookeeper version: ...
- ARM7与GSM实现的简单的远程控制
幸好单从控制GSM上来说,并不是太难,它是基于串口通信的,而且全是基于AT指令的控制,说起来,就只是熟悉下指令,而且这次比赛用到的指令也比较少,主要是关于短消息方面的指令.我们用到的指令如下: AT& ...
- error: cannot lock ref 'refs/remotes/origin/master': unable to resolve reference 'refs/remotes/origin/master': reference broken...
之前在自己的项目中添加了一个分支,然后做了一些操作,比如同步本地的分支情况到远程仓库中,然后在远程仓库中完成分支合并,以及 Pull request 等等操作,后来,在本地仓库中进行 git fetc ...
- 机器人学 —— 机器人感知(Mapping)
对于移动机器人来说,最吸引人的莫过于SLAM,堪称Moving Robot 皇冠上的明珠.Perception 服务于 SLAM,Motion Plan基于SLAM.SLAM在移动机器人整个问题框架中 ...
- 【CF471E】MUH and Lots and Lots of Segments 扫描线+并查集+线段树+set
[CF471E]MUH and Lots and Lots of Segments 题意:给你平面上n条水平或竖直的,端点在整点处的线段.你需要去掉一些线段的一些部分,使得剩下的图形:1.连通,2.无 ...
- [Codeforces Round #221 (Div. 1)][D. Tree and Queries]
题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...
- ajax方式提交表单数据并判断当前注册用户是否存在
项目的目录结构 源代码: regservlet.java package register; import java.io.IOException; import java.io.PrintWrite ...
- Oracle课程档案,第十六天
restore:恢复文件 recover: 恢复日志 丢失current日志组(正常关闭数据库):故障:SQL> select group#, status from v$log; 确认curr ...