记录编号 |
468398 |
评测结果 |
AAAAAAAAAA |
题目名称 |
距离 |
最终得分 |
100 |
用户昵称 |
WHZ0325 |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.274 s |
提交时间 |
2017-10-31 22:49:12 |
内存使用 |
0.84 MiB |
显示代码纯文本
#include <cstdio>
#include <vector>
using namespace std;
const int maxn=10005;
struct edge {int u,v,l;};
vector<edge> gt[maxn];
vector<edge> g[maxn];
int depth[maxn];
void build(int x,int fa) {
for(int i=0;i<gt[x].size();++i) {
if(gt[x][i].v!=fa) {
g[x].push_back(gt[x][i]);
depth[gt[x][i].v]=depth[x]+gt[x][i].l;
build(gt[x][i].v,x);
}
}
}
struct ask_node {int u,v,tag;};
vector<ask_node> asks[maxn];
int fa[maxn];
void init_set(int n) {
for(int i=1;i<=n;++i) {
fa[i]=i;
}
}
int find(int x) {
int root=x;
while(fa[root]!=root) {
root=fa[root];
}
while(fa[x]!=root) {
int t=fa[x];
fa[x]=root;
x=t;
}
return root;
}
void union_set(int x,int y) {
fa[find(x)]=find(y);
}
int vis[maxn],ans[2*maxn];
void tarjan(int x) {
for(int i=0;i<g[x].size();++i) {
tarjan(g[x][i].v);
union_set(g[x][i].v,x);
vis[g[x][i].v]=true;
}
for(int i=0;i<asks[x].size();++i) {
if(vis[asks[x][i].v]) {
int lca=find(asks[x][i].v);
ans[asks[x][i].tag]=depth[x]+depth[asks[x][i].v]-2*depth[lca];
}
}
}
int main() {
freopen("distance.in","r",stdin);
freopen("distance.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
int u,v,l;
for(int i=1;i<n;++i) {
scanf("%d%d%d",&u,&v,&l);
gt[u].push_back((edge){u,v,l});
gt[v].push_back((edge){v,u,l});
}
depth[1]=0;
build(1,-1);
for(int i=1;i<=m;++i) {
scanf("%d%d",&u,&v);
asks[u].push_back((ask_node){u,v,i});
asks[v].push_back((ask_node){v,u,i});
}
init_set(n);
tarjan(1);
for(int i=1;i<=m;++i) {
printf("%d\n",ans[i]);
}
fclose(stdin);
fclose(stdout);
return 0;
}