题意:给一棵树,查询一些点对的距离
解法:随便找一个点建立有根树,然后转化为求点对最近公共祖先问题。两点的距离等于他们与最近祖先的距离和。查询的方法是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)
{