首页 > 其他 > 详细

hdu 2586 lca模板题

时间:2014-03-29 15:25:51      阅读:403      评论:0      收藏:0      [点我收藏+]

How far away ?

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4106    Accepted Submission(s): 1567


Problem Description
There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like this "How far is it if I want to go from house A to house B"? Usually it hard to answer. But luckily int this village the answer is always unique, since the roads are built in the way that there is a unique simple path("simple" means you can‘t visit a place twice) between every two houses. Yout task is to answer all these curious people.
 

Input
First line is a single integer T(T<=10), indicating the number of test cases.
  For each test case,in the first line there are two numbers n(2<=n<=40000) and m (1<=m<=200),the number of houses and the number of queries. The following n-1 lines each consisting three numbers i,j,k, separated bu a single space, meaning that there is a road connecting house i and house j,with length k(0<k<=40000).The houses are labeled from 1 to n.
  Next m lines each has distinct integers i and j, you areato answer the distance between house i and house j.
 

Output
For each test case,output m lines. Each line represents the answer of the query. Output a bland line after each test case.
 

Sample Input
2 3 2 1 2 10 3 1 15 1 2 2 3 2 2 1 2 100 1 2 2 1
 

Sample Output
10 25 100 100
 

好久没写lca,回顾一下。

代码:

/* ***********************************************
Author :rabbit
Created Time :2014/3/29 11:40:24
File Name :E.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <string>
#include <time.h>
#include <math.h>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3f3f3f3f
#define eps 1e-8
#define pi acos(-1.0)
typedef long long ll;
const int maxn=50010;
int head[maxn],tol,dis[maxn],fa[maxn][20],dep[maxn];
struct node{
	int next,to,val;
}edge[5*maxn];
void addedge(int u,int v,int w){
	edge[tol].to=v;
	edge[tol].next=head[u];
	edge[tol].val=w;
	head[u]=tol++;
}
void bfs(int root){
	queue<int> q;
	fa[root][0]=root;dep[root]=0;dis[root]=0;
	q.push(root);
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=1;i<20;i++)fa[u][i]=fa[fa[u][i-1]][i-1];
		for(int i=head[u];i!=-1;i=edge[i].next){
			int v=edge[i].to;if(v==fa[u][0])continue;
			dep[v]=dep[u]+1;dis[v]=dis[u]+edge[i].val;fa[v][0]=u;
			q.push(v);
		}
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y])swap(x,y);
	for(int i=0;i<20;i++)if((dep[x]-dep[y])&(1<<i))x=fa[x][i];
	if(x==y)return x;
	for(int i=19;i>=0;i--)if(fa[x][i]!=fa[y][i])x=fa[x][i],y=fa[y][i];
	return fa[x][0];
}
int main()
{
     //freopen("data.in","r",stdin);
     //freopen("data.out","w",stdout);
     int T,n,m;
	 scanf("%d",&T);
	 while(T--){
		 scanf("%d%d",&n,&m);
		 memset(head,-1,sizeof(head));tol=0;
		 for(int i=1;i<n;i++){
			 int u,v,w;
			 scanf("%d%d%d",&u,&v,&w);
			 addedge(u,v,w);
			 addedge(v,u,w);
		 }
		 bfs(1);
		 while(m--){
			 int u,v;
			 scanf("%d%d",&u,&v);
			 printf("%d\n",dis[u]+dis[v]-2*dis[lca(u,v)]);
		 }
	 }
     return 0;
}


hdu 2586 lca模板题,布布扣,bubuko.com

hdu 2586 lca模板题

原文:http://blog.csdn.net/xianxingwuguan1/article/details/22483633

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!