DFS
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#define ll long long
#define For(i,a,n) for(register int i=a;i<=n;i++)
#define RF(i,a,n) for(register int i=a;i>=n;i--)
#define NIL -1
#define MAX 100005
using namespace std;
struct node{
int t,nex;
}e[100001];
int depht[50001], lg[50001], head[50001], father[50001][22];
int tot;
inline void add(int x,int y)
{
e[++tot].t=y;
e[tot].nex=head[x];
head[x]=tot;
}
inline void dfs(int now,int fath)
{
depht[now]=depht[fath]+1;
father[now][0]=fath;
for(register int i=1;(1<<i)<=depht[now];++i)
father[now][i]=father[father[now][i-1]][i-1];
for(register int i=head[now];i;i=e[i].nex)
{
if(e[i].t!=fath)dfs(e[i].t,now);
}
}
inline int lca(int x,int y)
{
if(depht[x]<depht[y])
swap(x,y);
while(depht[x]>depht[y])
x=father[x][lg[depht[x]-depht[y]]-1];
if(x==y)
return x;
for(register int k=lg[depht[x]];k>=0;--k)
if(father[x][k]!=father[y][k])
x=father[x][k],y=father[y][k];
return father[x][0];
}
int n,m,s;
int main()
{
scanf("%d%d%d",&n,&m,&s);
for(register int i=1;i<=n-1;++i)
{
int x,y;scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(s,0);
for(register int i=1;i<=n;++i)
lg[i]=lg[i-1]+(1<<lg[i-1]==i);
for(register int i=1;i<=m;++i)
{
int x,y;scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}
BFS
#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<iomanip>
#include<queue>
#define ll long long
#define For(i,a,n) for(register int i=a;i<=n;i++)
#define RF(i,a,n) for(register int i=a;i>=n;i--)
#define NIL -1
#define maxn 100005
using namespace std;
struct node{
int to,d,next;
}a[maxn];
int pre[maxn],cnt=0;
int vis[maxn];
int dis[maxn],f[maxn][22],depht[maxn];
int T;
void add(int x,int y,int z){
a[cnt].to=y; a[cnt].d=z; a[cnt].next=pre[x];
pre[x]=cnt++;
}
void bfs(int u) {
queue<int> q;
memset(vis,0,sizeof(vis));
memset(f,0,sizeof(f));
q.push(u);
vis[u]=1;
depht[u]=1;
while(q.size())
{
int x=q.front();
q.pop();
for(int i=pre[x];~i;i=a[i].next){
int y=a[i].to;
if(!vis[y])
{
dis[y]=dis[x]+a[i].d;
depht[y]=depht[x]+1;
vis[y]=1;
f[y][0]=x;
for(int j=1;j<=T;j++){
f[y][j]=f[f[y][j-1]][j-1];
}
q.push(y);
}
}
}
}
int LCA(int x,int y)
{
if(depht[x] > depht[y]) swap(x,y);
for(int i = T; i >= 0; i--)
if(depht[f[y][i]] >= depht[x]) y = f[y][i];
if(x == y) return x;
for(int i = T; i >= 0; i--)
if(f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];
return f[x][0];
}
int main(){
ios::sync_with_stdio(false); cin.tie(0);
int t,n,m;
cin>>t;
while(t--){
cin>>n>>m;
T = 22;
memset(pre,-1,sizeof(pre));
cnt=0;
for(int i=0;i<n-1;i++){
int x,y,s;
cin>>x>>y>>s;
add(x,y,s);
add(y,x,s);
}
bfs(1);
while(m--){
int x,y;
cin>>x>>y;
cout<<(dis[x]+dis[y]-2*dis[LCA(x,y)])<<endl;
}
}
return 0;
}