标签:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<vector> using namespace std; #define maxn 40005 #define maxe 205 int fa[maxn],dis[maxn],ancestor[maxn]; bool vis[maxn]; int first[maxn],nxt[maxn<<1],to[maxn<<1],cost[maxn<<1],e; int qfirst[maxn],qnxt[maxe<<1],qto[maxe<<1],qpre[maxe<<1],qe; int n,m; void add(int u,int v,int c){ to[e]=v;cost[e]=c;nxt[e]=first[u];first[u]=e++; } void qadd(int u,int v){ qto[qe]=v;qpre[qe]=u;qnxt[qe]=qfirst[u];qfirst[u]=qe++; } void inital(){ e=0; qe=0; dis[1]=0; for(int i=0;i<=n;i++){ fa[i]=i; vis[i]=0; first[i]=-1; qfirst[i]=-1; } } int finds(int x){ if(fa[x]!=x)return fa[x]=finds(fa[x]); } void unions(int x,int y){ int a=finds(x); int b=finds(y); if(a!=b)fa[b]=a; } void lca(int u,int fa){ for(int i=first[u];~i;i=nxt[i]){ int v=to[i];int c=cost[i]; if(v==fa)continue; if(!vis[v]){ dis[v]=dis[u]+c; lca(v,u); unions(u,v); } } vis[u]=true; for(int i=qfirst[u];~i;i=qnxt[i]){ int qv=qto[i]; if(vis[qv]){ ancestor[i]=ancestor[i^1]=finds(qv); } } } int main() { int t,u,v,c; //freopen("in.txt","r",stdin); scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); inital(); for(int i=1;i<n;i++){ scanf("%d%d%d",&u,&v,&c); add(u,v,c); add(v,u,c); } for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); qadd(u,v); qadd(v,u); } lca(1,-1); for(int i=0;i<m;i++){ int root=ancestor[i<<1]; int u=qpre[i<<1]; int v=qto[i<<1]; printf("%d\n",dis[u]+dis[v]-2*dis[root]); } } }
1
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:
原文地址:http://blog.csdn.net/u013497977/article/details/47306075