用dfs和lca均可,贴上两份代码
dfs
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#include <ctime>
#include <set>
#define ll long long
#define MP make_pair
#define PB push_back
#define SZ(x) ((int)(x).size())
#define REP(i,n) for (int i=0; (i)<(int)n; ++(i))
#define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it )
using namespace std;
const int N=40010;
struct Edge{
int next,w;
Edge(int a,int b):next(a),w(b){}
};
vector<Edge> e[N];
int ans,t,n,m;
bool found,vis[N];
void dfs(int u,int v,int cnt){
if(found) return;
if(u==v){
ans=cnt;
found=true;
return;
}
FOR(it,e[u]){
if(vis[it->next]) continue;
vis[it->next]=true;
dfs(it->next,v,cnt+it->w);
if(found) return;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
cin>>t;
while(t--){
int u,v,w;
cin>>n>>m;
REP(i,n-1){
scanf("%d%d%d",&u,&v,&w);
e[u].PB(Edge(v,w));
e[v].PB(Edge(u,w));
}
while(m--){
scanf("%d%d",&u,&v);
found=false;
memset(vis,0,sizeof(vis));
vis[u]=true;
ans=0;
dfs(u,v,0);
printf("%d\n",ans);
}
REP(i,n+1) e[i].clear();
}
return 0;
}
lca
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <map>
#include <queue>
#include <ctime>
#include <set>
#define ll long long
#define MP make_pair
#define PB push_back
#define SZ(x) ((int)(x).size())
#define REP(i,n) for (int i=0; (i)<(int)n; ++(i))
#define FOR(it,c) for ( __typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it )
using namespace std;
const int N=40010;
struct Edge{
int next,w;
Edge(int a,int b):next(a),w(b){}
};
vector<Edge> e[N],q[N];
int ans,t,n,m,p[N],u[210],v[210],dis[N],lca[N];
bool found,vis[N];
int find(int x){ return p[x]==x?x:p[x]=find(p[x]); }
void tarjan(int u){
vis[u]=true;
FOR(it,q[u]) if(vis[it->next]) lca[it->w]=find(it->next);
FOR(it,e[u]){
if(vis[it->next]) continue;
dis[it->next]=dis[u]+it->w;
tarjan(it->next);
p[it->next]=u;
}
}
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
#endif
cin>>t;
while(t--){
cin>>n>>m;
REP(i,n) p[i]=i;
REP(i,n-1){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
a--;b--;
e[a].PB(Edge(b,c));
e[b].PB(Edge(a,c));
}
REP(i,m){
scanf("%d%d",u+i,v+i);
u[i]--;v[i]--;
q[u[i]].PB(Edge(v[i],i));
q[v[i]].PB(Edge(u[i],i));
}
memset(vis,false,sizeof(vis));
tarjan(0);
REP(i,m) printf("%d\n",dis[u[i]]-2*dis[lca[i]]+dis[v[i]]);
REP(i,n){ e[i].clear(); q[i].clear(); }
}
return 0;
}