HDU 2586 How far away ?

来源:互联网 发布:无人机推荐 知乎 编辑:程序博客网 时间:2024/06/05 05:38

题意 在一棵树上问你两点之间的距离

裸的LCA

这里我用了离线算法的Tarjan做的(今天刚学的GG,在线的算法暂时还没看)

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long LL;const int Tmaxn = 40000+10;const int Qmaxn = 200+10;int dist[Tmaxn],vist[Tmaxn],fa[Tmaxn],head_tree[Tmaxn],head_query[Tmaxn];int res[Qmaxn][3];struct tree{int to,w,next;}Tree[Tmaxn<<1];struct query{int to,next;int id;}Query[Qmaxn<<1];int T,N,M;void Init(){for(int i = 1; i <= N; i++){vist[i] = dist[i] = 0;head_tree[i] = head_query[i] = -1;fa[i] = i;}}void ADD_tree(int u,int v,int w,int cnt){Tree[cnt].to = v;Tree[cnt].w = w;Tree[cnt].next = head_tree[u];head_tree[u] = cnt;}void ADD_query(int u,int v,int id,int cnt){Query[cnt].to = v;Query[cnt].next = head_query[u];Query[cnt].id = id;head_query[u] = cnt;}int  Find(int x){if(x != fa[x])x = Find(fa[x]);return x;}void Tarjan(int u,int father){for(int i = head_tree[u]; ~i; i = Tree[i].next){int v = Tree[i].to;if(!vist[v] && v!=father){dist[v] = dist[u]+Tree[i].w;Tarjan(v,u);fa[v] = u;}}vist[u] = 1;for(int i = head_query[u]; ~i; i = Query[i].next){int v = Query[i].to;if(vist[v]){res[Query[i].id][0] = dist[u];res[Query[i].id][1] = dist[v];int temp = Find(v);res[Query[i].id][2] = dist[temp];}}}int main(){scanf("%d",&T);int u,v,w;while(T--){scanf("%d %d",&N,&M);Init();for(int i = 0; i < N-1; i++){scanf("%d %d %d",&u,&v,&w);ADD_tree(u,v,w,i*2);ADD_tree(v,u,w,i*2+1);}for(int i = 0; i < M; i++){scanf("%d %d",&u,&v);ADD_query(u,v,i,i*2);ADD_query(v,u,i,i*2+1);}Tarjan(1,-1);for(int i = 0; i < M; i++)printf("%d\n",res[i][0]+res[i][1]-2*res[i][2]);}return 0;}


原创粉丝点击