记录编号 304404 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 Gravatarkxxy 是否通过 通过
代码语言 C++ 运行时间 0.853 s
提交时间 2016-09-08 13:58:47 内存使用 1.23 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=10010;
int vis[maxn]={0},d[maxn]={0},ans[maxn*4],fa[maxn];
struct edge
{
	int LCA,t,next;
	edge(){next=0;}
}E[maxn*4];
vector<pair<int,int> >A[maxn];
int head[maxn],now[maxn];
int read()
{
	int x=0;
	char c=getchar();
	while(c<'0'||c>'9')
		c=getchar();
	while(c>='0'&&c<='9')
	{
		x=x*10+c-'0';
		c=getchar();
	}
	return x;
}
int find(int x)
{
	if(fa[x]==x)
		return x;
	else return fa[x]=find(fa[x]);
}
void dfs(int u,int p,int x)
{
	d[u]=x;
	for(int i=0;i<A[u].size();i++)
	{
		int f=A[u][i].first;
		if(f!=p)
			dfs(f,u,x+A[u][i].second);
	}
}
void LCA(int u)
{
	vis[u]=1;
	for(int i=0;i<A[u].size();i++)
	{
		int f=A[u][i].first;
		if(!vis[f])
		{
			LCA(f);
			fa[f]=u;
		}
	}
	for(int i=head[u];i;i=E[i].next)
	{
		int f=E[i].t;
		if(vis[f])
		{
			E[i].LCA=find(f);
			ans[i]=d[u]+d[f]-2*d[E[i].LCA];
		}
	}
}
int main()
{
	freopen("distance.in","r",stdin);
	freopen("distance.out","w",stdout);
	int n,m;
	n=read();
	m=read();
	for(int i=1;i<=n;i++)
		fa[i]=i;
	int x,y,a,b,v;
	for(int i=1;i<=n-1;i++)
	{
		a=read(),b=read(),v=read();
		A[a].push_back(make_pair(b,v));
		A[b].push_back(make_pair(a,v));
	}
	for(int i=1;i<=m*2;i++)
	{
		x=read(),y=read();
		if(head[x])
		{
			E[now[x]].next=i;
			now[x]=i;
			E[i].t=y;
		}
		else
		{
			head[x]=i;
			now[x]=i;
			E[head[x]].t=y;
		}
		i++;
		if(head[y])
		{
			E[now[y]].next=i;
			now[y]=i;
			E[i].t=x;
		}
		else
		{
			head[y]=i;
			now[y]=i;
			E[head[y]].t=x;
		}
	}
	dfs(1,0,0);
	LCA(1);
	for(int i=1;i<=m*2;i+=2)
		cout<<max(ans[i],ans[i+1])<<endl;
	return 0;
}