hdu 2586 lca模板题
来源:互联网 发布:约瑟夫环c语言 编辑:程序博客网 时间:2024/06/02 03:16
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.
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
23 21 2 103 1 151 22 32 21 2 1001 22 1
Sample Output
1025100100
好久没写lca,回顾一下。
代码:
/* ***********************************************Author :rabbitCreated Time :2014/3/29 11:40:24File 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;}
0 0
- hdu 2586 lca模板题
- 【HDU 2586】LCA模板
- lca模板 hdu 2586
- HDU 2586 【LCA-Tarjan-模板】
- hdu 2586 How far away LCA在线RMQ(模板题)
- HDU 2586 How far away ?(LCA模板题)
- hdu 2586 How far away ? LCA 模板题
- LCA和RMQ练习,水题(LCA模板题):【hdu 2586】 How far away ?
- HDU 2586 How far away? LCA模板
- 【HDU 2586】LCA模版题
- hdu 2586 LCA模板题(离线和在线两种解法)
- HDU 2586 How far away ? (LCA模板题 Tarjan算法求最小公共祖先)
- HDU 2586 How far away (LCA模板题 树上点对间距离)
- HDU 2586 How far away LCA倍增模板
- HDU 2586 How far away ? (离线LCA Tarjan算法模板)
- HDU 2586 How far away?(lca模板)
- Hdu 2586 How far away ?【倍增LCA模板记录】
- poj1330 LCA模板题
- Algorithms: 散列表
- java获取url地址后缀名
- 学习Java基础的目的?
- 《黑马程序员》 静态方法中不能new内部类的实例对象的总结
- 久邦数码Android开发工程师(3G&GO桌面)2014年3月份笔试-初面
- hdu 2586 lca模板题
- 无缝滚动通用JS代码
- 大型高性能ASP.NET系统架构设计
- USACO:1.4.2 The Clocks 时钟(IOI 94) 解析
- 肌酐清除率-肌酐清除率计算公式-什么是肌酐清除率 (转载www.jiganqingchulv.com)
- 图片列表横向切换代码
- 谈MySQL数据库的最大体
- 【高薪就业必备03】java中对两个数在不用第三方变量互换?
- 什么是 1080p