hdu 2586
题目大意:给定n-1条边构成一棵树,无向的;和m个询问,对于每一个询问按顺序回答。
结题思路:lca算法算出最近公共祖先,然后dis[u]+dis[v]-2*dis[father](father是u,v的最近公共祖先),小trick是在构造询问树的时候把权值设成询问对应的输入顺序
#include#include #include #include #include #include #include using namespace std;const int maxn=40000+10;struct node{ int v,w,next;}e[maxn<<1],q[maxn<<1];int ehead[maxn],qhead[maxn],vis[maxn],fa[maxn],dis[maxn],ans[maxn];int eT,qT;int n,m;void build(node *ed,int *head,int &T,int u,int v,int w){ ed[T].v=v; ed[T].w=w; ed[T].next=head[u]; head[u]=T++;}void init(){ memset(ans,0,sizeof(ans)); memset(dis,0,sizeof(dis)); memset(ehead,-1,sizeof(ehead)); memset(qhead,-1,sizeof(qhead)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) fa[i]=i; eT=qT=0; int u,v,w; for(int i=0;i