记录编号 536816 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 GravatarDeacep 是否通过 通过
代码语言 C++ 运行时间 0.822 s
提交时间 2019-07-08 17:14:59 内存使用 14.51 MiB
显示代码纯文本
//LCA_Tarjan
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct qwq{
	int e,w;
	qwq(int x,int y):e(x),w(y){}
};
vector<qwq> fir[10004];
int f[10004];
int dis[10004];
int ans[20004];
bool vis[10004];
//int head,tail;
struct que{
	int ad;
	int num;
	que(int x,int y):ad(x),num(y){}
};
vector<que> q[20004];
int _find(int x){
	if(x!=f[x])
	return f[x]=_find(f[x]);
	return x;
}
void Init(){
	memset(dis,0,sizeof(dis));
	memset(vis,0,sizeof(vis));
	memset(f,0,sizeof(f));
}
void _union(int x,int y){
	if(_find(x)!=_find(y))f[f[y]]=f[x];//就是这样写没错,注意看42行 
}
void dfs(int pre,int pr,int d){
	f[pr]=pr;
	dis[pr]=d;
	for(int i=0;i<fir[pr].size();i++){
		if(fir[pr][i].e!=pre){//条件1无影响 //(!vis[fir[pr][i].e])&&
			dfs(pr,fir[pr][i].e,d+fir[pr][i].w);
//		int nx=fir[pr][i].e;
//		cout<<pr<<' '<<f[pr]<<' '<<nx<<' '<<f[nx]<<"->";
		_union(pr,fir[pr][i].e);}//如果括号不包括这里,相当于儿子认爸爸做儿子,有悖伦理(然而并查集岂不是。。。 
//		cout<<f[f[pr]]<<' '<<f[f[nx]]<<endl;
	}
	vis[pr]=1;
	for(int i=0;i<q[pr].size();i++){
		if(vis[q[pr][i].ad]){
//		cout<<pr<<' '<<dis[pr]<<' '<<q[pr][i].ad<<' '<<dis[q[pr][i].ad]<<' '<<_find(q[pr][i].ad)<<' '<<dis[_find(q[pr][i].ad)]<<endl;
		ans[q[pr][i].num]=dis[pr]+dis[q[pr][i].ad]-2*dis[_find(q[pr][i].ad)];
		}
	}
}
void print(){
	for(int i=0;i<m;i++)
	cout<<ans[i]<<endl;
}
int main(){
	Init();
	freopen("distance.in","r",stdin);
	freopen("distance.out","w",stdout);
	cin>>n>>m;
	int _p,_q,r;
	for(int i=0;i<n-1;i++){
		cin>>_p>>_q>>r;
		fir[_p].push_back(qwq(_q,r));
		fir[_q].push_back(qwq(_p,r));
	}
	for(int i=0;i<m;i++){
		cin>>_p>>_q;
		q[_p].push_back(que(_q,i));
		q[_q].push_back(que(_p,i));
	}
	dfs(0,1,0);
	print();
	return 0;
}