记录编号 |
398435 |
评测结果 |
AAAAAAAAAA |
题目名称 |
距离 |
最终得分 |
100 |
用户昵称 |
Arrow |
是否通过 |
通过 |
代码语言 |
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;
}