记录编号 468398 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 GravatarWHZ0325 是否通过 通过
代码语言 C++ 运行时间 0.274 s
提交时间 2017-10-31 22:49:12 内存使用 0.84 MiB
显示代码纯文本
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=10005;
struct edge {int u,v,l;};
vector<edge> gt[maxn];
vector<edge> g[maxn];
int depth[maxn];
void build(int x,int fa) {
	for(int i=0;i<gt[x].size();++i) {
		if(gt[x][i].v!=fa) {
			g[x].push_back(gt[x][i]);
			depth[gt[x][i].v]=depth[x]+gt[x][i].l;
			build(gt[x][i].v,x);
		}
	}
}
struct ask_node {int u,v,tag;};
vector<ask_node> asks[maxn];
int fa[maxn];
void init_set(int n) {
	for(int i=1;i<=n;++i) {
		fa[i]=i;
	}
}
int find(int x) {
	int root=x;
	while(fa[root]!=root) {
		root=fa[root];
	}
	while(fa[x]!=root) {
		int t=fa[x];
		fa[x]=root;
		x=t;
	}
	return root;
}
void union_set(int x,int y) {
	fa[find(x)]=find(y);
}
int vis[maxn],ans[2*maxn];
void tarjan(int x) {
	for(int i=0;i<g[x].size();++i) {
		tarjan(g[x][i].v);
		union_set(g[x][i].v,x);
		vis[g[x][i].v]=true;
	}
	for(int i=0;i<asks[x].size();++i) {
		if(vis[asks[x][i].v]) {
			int lca=find(asks[x][i].v);
			ans[asks[x][i].tag]=depth[x]+depth[asks[x][i].v]-2*depth[lca];
		}
	}
}
int main() {
	freopen("distance.in","r",stdin);
	freopen("distance.out","w",stdout);
	int n,m;
	scanf("%d%d",&n,&m);
	int u,v,l;
	for(int i=1;i<n;++i) {
		scanf("%d%d%d",&u,&v,&l);
		gt[u].push_back((edge){u,v,l});
		gt[v].push_back((edge){v,u,l});
	}
	depth[1]=0;
	build(1,-1);
	for(int i=1;i<=m;++i) {
		scanf("%d%d",&u,&v);
		asks[u].push_back((ask_node){u,v,i});
		asks[v].push_back((ask_node){v,u,i});
	}
	init_set(n);
	tarjan(1);
	for(int i=1;i<=m;++i) {
		printf("%d\n",ans[i]);
	}
	fclose(stdin);
	fclose(stdout);
	return 0;
}