# include <iostream>
# include <cstdio>
# include <cstring>
# include <string>
# include <cmath>
# include <vector>
# include <map>
# include <queue>
# include <cstdlib>
# define MAXN 40001
using namespace std;
int n, mm, s;
int fa[MAXN], qx[MAXN], qy[MAXN], ans[MAXN], f[MAXN];
vector <int> vec[MAXN], q[MAXN];
struct node
{
int x,y;
node(int a,int b)
{
x=a,y=b;
}
bool operator <(const node &no)const
{
if(y!=no.y) return y<no.y;
if(y==no.y)
return (x<no.x );
}
};
map<node,int> m;
inline int find(int x)
{
return x == fa[x] ? x : find(fa[x]);
}
inline void dfs(int u)
{
int i, v;
fa[u] = u;
for(i = 0; i < vec[u].size(); i++)
{
v = vec[u][i];
if(f[u] != v) f[v] = u, dfs(v);
}
for(i = 0; i < q[u].size(); i++)
if(f[v = u ^ qx[q[u][i]] ^ qy[q[u][i]]])//^运算获得与u相连的点(qx,qy中必有一个是u)
{
ans[q[u][i]] = find(v);
}
fa[u] = f[u];//这里f相当于vis数组
}
void solve()
{
for(int i=1;i<=mm;i++)
{
int u=qx[i];
int v=qy[i];
int tmp=ans[i];
int sum=0;
while(v!=tmp)
{
sum+=m[node(v,fa[v])];
v=fa[v];
}
while(u!=tmp)
{
sum+=m[node(u,fa[u])];
u=fa[u];
}
ans[i]=sum;
}
}
int main()
{
int i, x, y,z;
int t;
cin>>t;
while(t--)
{
cin>>n>>mm;
for(i = 1; i < n; i++)
{
cin>>x>>y>>z;
m[node(x,y)]=z;
m[node(y,x)]=z;
vec[x].push_back(y);
vec[y].push_back(x);
}
for(i = 1; i <= mm; i++)
{
cin>>qx[i]>>qy[i];
q[qx[i]].push_back(i);
q[qy[i]].push_back(i);
}
dfs(1);
solve();
for(i = 1; i <= mm; i++) printf("%d\n", ans[i]);
}
return 0;
}
/*
2
3 2
1 2 10
3 1 15
2 3
1 2
*/
hdu2586
最新推荐文章于 2024-05-11 18:26:23 发布