比赛 不准粘代码,必须自己写(HS除外) 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 梦那边的美好ET 运行时间 0.365 s
代码语言 C++ 内存使用 15.77 MiB
提交时间 2019-09-29 22:29:02
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
vector<int>b[10010],c[10010];
int n,m,fa[10010][21],s[10010][21],a1,a2,a3,sd[10010],ans;
bool bk[10010];
inline void dfs(int p){bk[p]=1;
    for(int i=1;i<=20;i++)fa[p][i]=fa[fa[p][i-1]][i-1],s[p][i]=s[fa[p][i-1]][i-1]+s[p][i-1];
    for(int i=0;i<b[p].size();i++){
    	if(!bk[b[p][i]]){
    		fa[b[p][i]][0]=p;s[b[p][i]][0]=c[p][i];sd[b[p][i]]=sd[p]+1;
    		dfs(b[p][i]);
    	}
    }
    return;
}
inline int lca(int x,int y){
	if(sd[x]<sd[y]){int fz=x;x=y;y=fz;}
	int p=sd[x]-sd[y];
	for(int i=20;i>=0;i--){
		if((1<<i)<=p){
			p-=(1<<i);
			ans+=s[x][i];x=fa[x][i];
		}
	}
	if(x==y)return x;
	for(int i=20;i>=0;i--){
		if(fa[x][i]!=fa[y][i]){
			ans+=s[x][i]+s[y][i];
			x=fa[x][i];y=fa[y][i];
		}
	}
	ans+=s[x][0]+s[y][0];
	return fa[x][0];
}
int main(){
    freopen("distance.in","r",stdin);
    freopen("distance.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n-1;i++){
    	scanf("%d%d%d",&a1,&a2,&a3);
    	b[a1].push_back(a2);b[a2].push_back(a1);
    	c[a1].push_back(a3);c[a2].push_back(a3);
    }
    dfs(1);
    while(m--){
    	scanf("%d%d",&a1,&a2);
    	ans=0;int lc=lca(a1,a2);
    	printf("%d\n",ans);
    }
    return 0;
}