题目:
链接:点击打开链接
题意:
思路:
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int N = 40040;
const int M = 220;
struct node{
int from;
int to;
int next;
int val;
}edge[2*N];
struct node1{
int from;
int to;
int next;
int num;
}edge1[2*M];
int tol,head[N],head1[N],tol1;
int father[N],dis[N],LCA[M];
int n,m;
int vis[N];
void add(int u,int v,int w)
{
edge[tol].from = u;
edge[tol].to = v;
edge[tol].next = head[u];
edge[tol].val = w;
head[u] = tol++;
}
void add1(int u,int v,int w)
{
edge1[tol1].from = u;
edge1[tol1].to = v;
edge1[tol1].next = head1[u];
edge1[tol1].num = w;
head1[u] = tol1++;
}
int findset(int x)
{
return father[x] == x ? x : father[x] = findset(father[x]);
}
void Tarjan(int u)
{
int v;
vis[u] = 1;
father[u] = u;
for(int j=head1[u]; j!=-1; j=edge1[j].next)
{
v = edge1[j].to;
if(vis[v])
LCA[edge1[j].num] = findset(v);
}
for(int j=head[u]; j!=-1; j=edge[j].next)
{
v = edge[j].to;
if(!vis[v])
{
dis[v] = dis[u] + edge[j].val;
Tarjan(v);
father[v] = u;
}
}
}
void init()
{
tol = 0;
tol1 = 0;
dis[1] = 0;
memset(head,-1,sizeof(head));
memset(head1,-1,sizeof(head1));
memset(vis,0,sizeof(vis));
}
int main()
{
//freopen("input.txt","r",stdin);
int t;
int a,b,c;
cin>>t;
while(t--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1; i<n; i++)
{
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
for(int i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
add1(a,b,i);
add1(b,a,i);
}
Tarjan(1);
for(int i=0; i<tol1; i+=2)
{
a = edge1[i].from;
b = edge1[i].to;
c = edge1[i].num;
printf("%d\n",dis[a] + dis[b] - 2*dis[LCA[c]]);
}
}
return 0;
}
--------------------------------------------------------------------
战斗,从不退缩;奋斗,永不停歇~~~~~~~~~~~~~