记录编号 251571 评测结果 AAAAAAAAAA
题目名称 [USACO Oct08] 牧场旅行 最终得分 100
用户昵称 GravatarMarvolo 是否通过 通过
代码语言 C++ 运行时间 0.021 s
提交时间 2016-04-18 13:24:49 内存使用 8.14 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<vector>
#include<map>
using namespace std;

int n,q,x,y,i,j;
int f[1010],fa[1010],w[1010],ww[1010];
bool v[1010];
int l[1010][1010],lca[1010][1010];
vector<int> b[1010],son[1010];

void maketree(int p){
	int i;
	v[p]=true;
	if (b[p].size()==0)	return;
	for (i=0;i<=b[p].size()-1;i++)
	if (v[b[p][i]]==false)	{
		f[b[p][i]]=p;		
		son[p].push_back(b[p][i]);
		maketree(b[p][i]);
	}
	return;
}			//	DFS建树 

void ready(){
	int i;
	for (i=1;i<=n;i++){
	b[i].clear();	v[i]=false;	fa[i]=i;		}
	return;
}			//	预处理 

int find(int x){
	if (fa[x]==x)	return x;
	else {	fa[x]=find(fa[x]);return fa[x];}
}

void tarjan(int p){
	int i,q,w;
	if (son[p].size()!=0)	{
		for (i=0;i<=son[p].size()-1;i++)
			if (!v[son[p][i]]){
			tarjan(son[p][i]);
			fa[son[p][i]]=p;
				}
	}
	v[p]=true;
	
	if (b[p].size()!=0)		
	for (i=0;i<=b[p].size()-1;i++)
	if (v[b[p][i]])	{
	lca[p][b[p][i]]=find(b[p][i]);
	lca[b[p][i]][p]=find(b[p][i]);
	}
	
	return;
}			//	Tarjan求LCA 

void answer(int p,int q,int lc){
	int e,u,ans;
	e=p;	u=q;	ans=0; 
	while (e!=lc){
	ans+=l[e][f[e]];
	e=f[e];
	}
	while (u!=lc){
	ans+=l[u][f[u]];
	u=f[u];
	}
	printf("%d\n",ans);
	return;	
}			//	计算距离 

int main(){
	freopen("pwalk.in","r",stdin);
	freopen("pwalk.out","w",stdout);
	scanf("%d%d",&n,&q);
	
	for (i=1;i<=n-1;i++){
		scanf("%d%d",&x,&y);
		scanf("%d",&l[x][y]);
		l[y][x]=l[x][y];
		b[x].push_back(y);	b[y].push_back(x);
	}
	f[1]=1;
	maketree(1);
	ready();
	for (i=1;i<=q;i++){
	scanf("%d%d",&w[i],&ww[i]);
	b[w[i]].push_back(ww[i]);	b[ww[i]].push_back(w[i]);
		}
	fa[1]=1;
	tarjan(1);
	 
	for (i=1;i<=q;i++)
	answer(w[i],ww[i],lca[w[i]][ww[i]]);
	return 0;
}