记录编号 398435 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 GravatarArrow 是否通过 通过
代码语言 C++ 运行时间 0.162 s
提交时间 2017-04-22 10:59:00 内存使用 0.75 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<vector>
#define MAXN 10010
#define MAXM 20010
using namespace std;
	int n;
	struct Edge
	{
		int to,w;
	};
	vector <Edge> G[MAXN];
	bool vis[MAXN]={0};
	int dis[MAXN]={0};
	vector <Edge> ask[MAXN];
	int fa[MAXN]={0};
	int ancestor[MAXN]={0};
	int ans[MAXM]={0};
int find(int x)
{
	if(x==fa[x])
		return x;
	fa[x]=find(fa[x]);
	return fa[x];
}
void dfs(int x)
{
	vis[x]=1;
	for(int i=0;i<(int)G[x].size();i++)
	{
		Edge& y=G[x][i];
		if(!vis[y.to])
		{
			dis[y.to]=dis[x]+y.w;
			dfs(y.to);
		}
	}
}
void LCA(int x,int f)
{
	for(int i=0;i<(int)G[x].size();i++)
	{
		int y=G[x][i].to;
		if(y!=f)
		{
			LCA(y,x);
			int fy=find(y);
			int fx=find(x);
			fa[fx]=fy;
			ancestor[fy]=x;
		}
	}
	vis[x]=1;
	for(int i=0;i<(int)ask[x].size();i++)
	{
		if(vis[ask[x][i].to])
		{
			ans[ask[x][i].w]=dis[x]+dis[ask[x][i].to]-2*dis[ancestor[find(ask[x][i].to)]];
		}
	}
}
int main()
{
	freopen("distance.in","r",stdin);
	freopen("distance.out","w",stdout);
	int n,m;
	scanf("%d",&n);
	scanf("%d",&m);
	for(int i=1;i<n;i++)
	{
		int x,y,z;
		scanf("%d",&x);scanf("%d",&y);scanf("%d",&z);
		G[x].push_back((Edge){y,z});
		G[y].push_back((Edge){x,z});
	}
	dis[1]=0;
	dfs(1);
	for(int i=1;i<=m;i++)
	{
		int u,v;
		scanf("%d",&u);scanf("%d",&v);
		if(u!=v)
		{
			ask[u].push_back((Edge){v,i});
			ask[v].push_back((Edge){u,i});
		}
		else ans[i]=0;
	}
	for(int i=1;i<=n;i++)
		fa[i]=i;
	memset(vis,0,sizeof(vis));
	LCA(1,0);
	for(int i=1;i<=m;i++)
		printf("%d\n",ans[i]);
return 0;
}