记录编号 326050 评测结果 AAAAAAAAAA
题目名称 [USACO Oct08] 牧场旅行 最终得分 100
用户昵称 Gravatarkito 是否通过 通过
代码语言 C++ 运行时间 0.005 s
提交时间 2016-10-20 19:17:21 内存使用 0.34 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
#define	fcl	fclose(stdin);	fclose(stdout);	return 0
	#define	SUBMIT 2333
int n,q;
struct EDGE{
	int to,dis,next;
}edge[2010];
int head[1010],tot=0;
inline void AddEdge(const int& a,const int& b,const int& c){
	edge[++tot].to=b;
	edge[tot].dis=c;
	edge[tot].next=head[a];
	head[a]=tot;
}

int deep[1010],son[1010]={0},prt[1010],size[1010];
bool flag[1010]={false};
int top[1010],w[1010];
void Dfs1(int u){
	size[u]=1;
	flag[u]=true;
	int y;
	for(int x=head[u];x;x=edge[x].next){
		y=edge[x].to;
		if(!flag[y]){
			prt[y]=u;
			deep[y]=deep[u]+1;
			w[y]=w[u]+edge[x].dis;
			Dfs1(y);
			size[u]+=size[y];
			if(size[son[u]]<size[y])	son[u]=y;
		}
	}
}

void Dfs2(int u,int tp){
	top[u]=tp;
	if(son[u]){
		Dfs2(son[u],tp);
	}
	int y;
	for(int x=head[u];x;x=edge[x].next){
		y=edge[x].to;
		if(prt[y]==u&&son[u]!=y){
			Dfs2(y,y);
		}
	}
}

int Lca(int a,int b){
	while(top[a]!=top[b]){
		if(deep[top[a]]<deep[top[b]]){
			b=prt[top[b]];
		}
		else	a=prt[top[a]];
	}
	if(deep[a]<deep[b])	return a;
	return b;
}

void Query(int a,int b){
	int c=Lca(a,b);
	printf("%d\n",w[a]-w[c]+w[b]-w[c]);
}

int main(){
	#ifdef SUBMIT
	freopen("pwalk.in","r",stdin);
	freopen("pwalk.out","w",stdout);
	#endif
	scanf("%d%d",&n,&q);
	int a,b,c;
	for(int i=1;i<n;++i){
		scanf("%d%d%d",&a,&b,&c);
		AddEdge(a,b,c);
		AddEdge(b,a,c);
	}
	deep[1]=1;
	Dfs1(1);
	Dfs2(1,1);
	for(int i=1;i<=q;++i){
		scanf("%d%d",&a,&b);
		Query(a,b);
	}
	#ifndef SUBMIT
	getchar();	getchar();
	#endif
	fcl;
}