您的位置:首页 > 其它

How far away ?

2015-07-20 20:36 387 查看
#include<iostream>
#include <algorithm>
using namespace std;
const int M=40010;
int dis[M],data[4*M],ext[4*M],head[M],value[4*M],ans[205],pa[M];
int len,l,vis[M],da[900],ne[900],he[M],id[900];
int find(int x)
{
return x==pa[x]?x:find(pa[x]);
}
void add(int a,int b,int k)
{
value[len]=k;
data[len]=b;
ext[len]=head[a];
head[a]=len++;
}
void ad(int a,int b,int k)
{
id[l]=k;
da[l]=b;
ne[l]=he[a];
he[a]=l++;
}
void tarjan(int u,int fa)
{
vis[u]=1;
int v;
pa[u]=u;
for(int t=head[u];t!=-1;t=ext[t])
{
v=data[t];
if(v!=fa)
{
dis[v]=dis[u]+value[t];
tarjan(v,u);

}

}for(int t=he[u];t!=-1;t=ne[t])
{
v=da[t];
if(vis[v])ans[id[t]]=find(v);

}
pa[u]=fa;

}
void init()
{
len=l=0;
memset(head,-1,sizeof head);
memset(ext,-1,sizeof ext);
memset(ne,-1,sizeof ne);
memset(he,-1,sizeof he);

memset(vis,0,sizeof vis);
}
int main()
{
int T;
int n,m;
int x,y,z;
int a[205],b[205];
scanf("%d",&T);
while(T--)
{
init();
scanf("%d%d",&n,&m);
for(int i=1;i<n;i++)
{
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a[i],&b[i]);
ad(a[i],b[i],i);
ad(b[i],a[i],i);
}
dis[1]=0;

tarjan(1,0);
//	puts("SDFWSD");
for(int i=1;i<=m;i++)
printf("%d\n",dis[a[i]]+dis[b[i]]-2*dis[ans[i]]);
//printf("%d\n",ans[i]);

}
}
/*
9
7 5
1 2 3
1 3 2
2 4 8
2 5 5
3 6 6
3 7 4
4 5
7 3
4 6
2 6
5 7
11 6
1 2 4
1 3 5
1 4 4
2 10 6
10 11 2
3 5 7
5 6 1
4 7 3
7 8 8
7 9 9
1 6
11 9
5 4
7 8
2 11
8 9
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: