记录编号 301963 评测结果 AAAAAAAAAA
题目名称 距离 最终得分 100
用户昵称 Gravatar农场主 是否通过 通过
代码语言 C++ 运行时间 0.999 s
提交时间 2016-09-03 08:26:07 内存使用 70.88 MiB
显示代码纯文本
#include<cstdio>
#include<vector>
#include<algorithm>
#define maxn 2000000
using namespace std;
int n,m;
vector<int> G[maxn],Q[maxn];
int d[maxn]={0},t[maxn]={0};
int f[maxn]={0};
void init(int n){
	for (int i=1;i<=n;i++){
		f[i]=i;
	}
}
int find(int x){
	return x==f[x]?x:f[x]=find(f[x]);
}
void merge(int a,int b){
	f[find(a)]=find(b);
}
struct poi{
	int from,to,ans; 
};
vector<poi> q;
vector<poi> edges;
bool vis[maxn]={0};
#define e edges[G[x][i]]
void dfs(int x){
	vis[x]=1;
	//t[x]+=d[x];
	for (int i=0;i<G[x].size();i++)if ((vis[e.from]&vis[e.to])==0){
		int to;
		if (vis[e.from]==1) to=e.to;
		else to=e.from;
		t[to]=e.ans+t[x];
		//printf("		%d %d\n",to,t[to]);
		dfs(to);
		merge(to,x);
	}
	for (int i=0;i<Q[x].size();i++){
		poi &p=q[Q[x][i]];
		if (vis[p.from]&vis[p.to]==1){
			if (p.from==x){
				p.ans=find(p.to);
			}
			else{
				p.ans=find(p.from);
			}
		}
	}
}
void read(){
	scanf("%d",&n);
	scanf("%d",&m);
	init(n);
	/*for (int i=1;i<=n;i++){
		scanf("%d",&d[i]);
	}*/ 
	for (int i=1;i<n;i++){
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w); 
		edges.push_back((poi){u,v,w});
		G[u].push_back(edges.size()-1);
		G[v].push_back(edges.size()-1);
	}
	for (int i=1;i<=m;i++){
		int u,v,w;
		scanf("%d%d",&u,&v);
		q.push_back((poi){u,v,0});
		Q[u].push_back(q.size()-1);
		Q[v].push_back(q.size()-1);
	}
	dfs(1);
	//printf("	%d %d %d\n",t[3],t[2],t[1]);
	for (int i=0;i<m;i++){
		printf("%d\n",t[q[i].from]+t[q[i].to]+d[q[i].ans]-t[q[i].ans]*2);
	}
}
int main(){
	freopen("distance.in","r",stdin);
	freopen("distance.out","w",stdout);
	read();
	return 0;
}