Title Address: HDU 2586
LCA first hair.
A purely template problem.
Lazy vector, the result has been explosive stack. changing g++ to C + + is over.
The code is as follows:
#include <iostream>#include <string.h>#include <math.h>#include <queue>#include <algorithm>#include <stdlib.h>#include <map>#include <set>#include <stdio.h>using namespace STD;#define LL __int64#define PI ACOs ( -1.0)#pragma COMMENT (linker, "/stack:1024000000")Const intMod=1e9+7;Const intinf=0x3f3f3f3f;Const Doubleeqs=1e-9;Const intmaxn=40000+Ten;intBIN[MAXN], DIS[MAXN], HEAD[MAXN], CNT, N, VIS[MAXN], ANS[MAXN]; vector<int>VEC[MAXN], NUM[MAXN];structnode{intU, V, W, next;} edge[maxn<<1];voidAddintUintVintW) {edge[cnt].v=v; Edge[cnt].w=w; Edge[cnt].next=head[u]; head[u]=cnt++;}intFind1 (intx) {returnBin[x]==x?x:bin[x]=find1 (Bin[x]);}voidTarjan (intu) {vis[u]=1; for(intI=0; I<vec[u].size (); i++) {intV=vec[u][i];if(!vis[v])Continue; ans[num[u][i]]=dis[u]+dis[v]-2*dis[find1 (v)]; } for(inti=head[u];i!=-1; i=edge[i].next) {intV=EDGE[I].V;if(Vis[v])Continue; DIS[V]=DIS[U]+EDGE[I].W; Tarjan (v); Bin[v]=u; }}voidInit () {memset(head,-1,sizeof(head));memset(Vis,0,sizeof(VIS)); Cnt=0; for(intI=1; i<=n;i++) {bin[i]=i; }}intMain () {intT, M, I, J, U, V, W;scanf("%d", &t); while(t--) {scanf("%d%d", &n,&m); Init (); for(i=0; i<n-1; i++) {scanf("%d%d%d", &u,&v,&w); Add (U,V,W); Add (V,U,W); } for(i=0; i<m;i++) {scanf("%d%d", &u,&v); Vec[u].push_back (v); Num[u].push_back (i); Vec[v].push_back (U); Num[v].push_back (i); } dis[1]=0; Tarjan (1); for(i=0; i<m;i++) {printf("%d\n", Ans[i]); } }return 0;}
HDU 2586 how far away? (LCA recent public ancestor)