题意:给出一个有权树,求任意两点的之间的距离。
分析:思想就是以一个点 root 作为跟变成有根数,然后深搜处理处所有点到跟的距离。求要求的两个点的LCA(最近公共祖先),
然后ans = dis【x】 + dis【y】 - 2 * dis【LCA(x,y)】,可以画图分析一下就知道。
求LCA我用的是Tarjan离线lca,由于询问次数很多,所以这个比较快。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
const int N = 44000;
#define INF 1000000000
using namespace std;
struct Node
{
int to,val;
};
vector<Node> v[N];
vector<int> query[N],num[N];
int ans[N];
bool vis[N];
int dis[N],father[N];
void isit(int n)
{
for(int i = 0;i<=n;i++