标签:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6727 Accepted Submission(s): 2497
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <vector>
using namespace std;
using namespace std;
const int maxn=50010;
vector<int> v[maxn],w[maxn],query[maxn],num[maxn];
int tt,n,m,dist[maxn],ans[maxn],fa[maxn];
bool vis[maxn];
void init()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
v[i].clear();
w[i].clear();
query[i].clear();
num[i].clear();
dist[i]=0;
vis[i]=0;
ans[i]=0;
}
}
int find(int x)
{
if(x!=fa[x])
fa[x]=find(fa[x]);
return fa[x];
}
void Union(int x,int y)
{
int fx=find(x);
int fy=find(y);
if(fx!=fy)
fa[fy]=fx;
}
void tarjan(int cur,int val)
{
vis[cur]=1;
dist[cur]=val;
for(int i=0;i<v[cur].size();i++)
{
int temp=v[cur][i];
if(vis[temp]) continue;
tarjan(temp,val+w[cur][i]);
Union(cur,temp);
}
for(int i=0;i<query[cur].size();i++)
{
int temp=query[cur][i];
if(!vis[temp]) continue;
ans[num[cur][i]]=dist[cur]+dist[temp]-2*dist[find(temp)];
}
}
int main()
{
int x,y,z;
scanf("%d",&tt);
while(tt--)
{
scanf("%d%d",&n,&m);
init();
for(int i=0;i<n-1;i++)
{
scanf("%d%d%d",&x,&y,&z);
v[x].push_back(y);
v[y].push_back(x);
w[x].push_back(z);
w[y].push_back(z);
}
for(int i=0;i<m;i++)
{
scanf("%d%d",&x,&y);
query[x].push_back(y);
query[y].push_back(x);
num[x].push_back(i);
num[y].push_back(i);
}
tarjan(1,0);
for(int i=0;i<m;i++)
printf("%d\n",ans[i]);
}
return 0;
}
标签:
原文地址:http://www.cnblogs.com/a972290869/p/4372951.html