poj 1986(离线查询点对最近公共祖先)

博客详细介绍了如何解决POJ 1986问题,该问题涉及一棵树上的点对距离查询。解题核心在于将问题转换为求解点对最近公共祖先,并采用DFS配合并查集的离线查询方法。在DFS过程中,通过vis标记和修改parent指针来处理查询,当遇到已访问过的点时,确定最近公共祖先为并查集中该点的最终祖先。
摘要由CSDN通过智能技术生成

题意:给一棵树,查询一些点对的距离


解法:随便找一个点建立有根树,然后转化为求点对最近公共祖先问题。两点的距离等于他们与最近祖先的距离和。查询的方法是dfs+并查集离线查询。思想是,dfs过的为回溯的点的parent全部指向自己本身,vis标记为true。回溯之后的点parent指向自己的父亲。然后dfs每进入一个点,就处理这个点相关的查询,如果其中某个查询另一个点v的vis为true,那么它们俩的最近公共祖先就是并查集中v的最终祖先。


代码:

#include <cstring>
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
int n,m;
const int Max=100100;
struct edge
{
    int v;
    int ran;
    int next;
} edges[Max*2];
int head[Max];
int parent[Max];
int dis[Max];
int ans[Max];
int count1=0;
vector<pair<int,int> > vec[Max];
bool vis[Max];
int getparent(int u)
{
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值