# POJ 1986 - Distance Queries(LCA‘ 在线算法RMQ)

463人阅读 评论(0)

AC.

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;
const int maxn = 40005;
int rmq[2*maxn];

struct ST {
int mm[2*maxn];
int dp[2*maxn][30];
void init(int n) {
mm[0] = -1;
for(int i = 1; i <= n; ++i) {
mm[i] = ((i&(i-1)) == 0) ? mm[i-1]+1: mm[i-1];
dp[i][0] = i;
}
for(int j = 1; j <= mm[n]; ++j) {
for(int i = 1; i+(1<<j) - 1 <= n; i++) {
dp[i][j] = rmq[dp[i][j-1]] < rmq[dp[i+(1<<(j-1))][j-1]]?
dp[i][j-1]: dp[i+(1<<(j-1))][j-1];
}
}
}
int query(int a, int b) {
if(a > b) swap(a, b);
int k = mm[b-a+1];

int p = dp[a][k], q = dp[b-(1<<k)+1][k];
return rmq[p] <= rmq[q]? p: q;
}
};

struct Edge {
int to, next, w;
};
Edge edge[maxn*2];

int F[maxn*2], P[maxn], dis[maxn];
bool flag[maxn];
int cnt;

ST st;
void init()
{
tot = 0;
memset(flag, 0,sizeof(flag));
}
void addedge(int u, int v, int w)
{
edge[tot].w = w;
edge[tot].to = v;
}

void dfs(int u, int pre, int dep)
{
F[++cnt] = u;
rmq[cnt] = dep;
P[u] = cnt;
for(int i = head[u]; i != -1; i = edge[i].next) {
int v = edge[i].to;
if(v == pre) continue;
dis[v] = dis[u] + edge[i].w;
dfs(v, u, dep+1);
F[++cnt] = u;
rmq[cnt] = dep;
}
}
void LCA_init(int root, int node_num)
{
cnt = 0;
dis[1] = 0;
dfs(root, root, 0);
st.init(2*node_num-1);
}
int query_lac(int u, int v)
{
return F[st.query(P[u], P[v])];
}

int main()
{
//freopen("in", "r", stdin);
int V, N, u, v;
while(~scanf("%d %d", &V, &N)) {
int u, v, w;
char r;
init();

for(int i = 0; i < N; ++i) {
scanf("%d%d%d %c", &u, &v, &w, &r);
flag[v] = true;
}
int root;
for(int i = 1; i <= V; ++i) {
if(!flag[i]) {
root = i;
break;
}
}

LCA_init(root, V);

int K;
scanf("%d", &K);
while(K--) {
int u, v;
scanf("%d %d", &u, &v);
int c = query_lac(u, v);
//printf("c = %d\n", c);
//printf("%d %d %d\n", dis[u], dis[v], dis[c]);
printf("%d\n", dis[u]+dis[v] - 2*dis[c]);
}
}
return 0;
}


0
0

【直播】机器学习&数据挖掘7周实训--韦玮
【套餐】系统集成项目管理工程师顺利通关--徐朋
【直播】3小时掌握Docker最佳实战-徐西宁
【套餐】机器学习系列套餐（算法+实战）--唐宇迪
【直播】计算机视觉原理及实战--屈教授
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之矩阵--黄博士
【套餐】微信订阅号+服务号Java版 v2.0--翟东平
【直播】机器学习之凸优化--马博士
【套餐】Javascript 设计模式实战--曾亮

* 以上用户言论只代表其个人观点，不代表CSDN网站的观点或立场
Dreaming
Double Fighting
个人资料
• 访问：165108次
• 积分：5882
• 等级：
• 排名：第4291名
• 原创：438篇
• 转载：2篇
• 译文：7篇
• 评论：22条
最新评论