How far away ? (hdu 2586 LCA)
来源:互联网 发布:skype 4.3 for ubuntu 编辑:程序博客网 时间:2024/05/18 01:15
How far away ?
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 9191 Accepted Submission(s): 3225
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
Source
ECJTU 2009 Spring Contest
Recommend
lcy | We have carefully selected several similar problems for you: 3486 2874 2888 3234 2818
题意:给出一棵n个节点的树及n-1条边,m次询问,每次询问求a,b之间的最短距离。
思路:LCA模板题。具体算法思想:http://www.cppblog.com/keroro/archive/2013/05/17/200341.html
代码:
#include <iostream>#include <functional>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <string>#include <map>#include <stack>#include <vector>#include <set>#include <queue>#pragma comment (linker,"/STACK:102400000,102400000")#define pi acos(-1.0)#define eps 1e-6#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r#define FRE(i,a,b) for(i = a; i <= b; i++)#define FREE(i,a,b) for(i = a; i >= b; i--)#define FRL(i,a,b) for(i = a; i < b; i++)#define FRLL(i,a,b) for(i = a; i > b; i--)#define mem(t, v) memset ((t) , v, sizeof(t))#define sf(n) scanf("%d", &n)#define sff(a,b) scanf("%d %d", &a, &b)#define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)#define pf printf#define DBG pf("Hi\n")typedef long long ll;using namespace std;#define INF 0x3f3f3f3f#define mod 1000000009const int maxn = 500000;const int MAXN = 2005;const int MAXM = 200010;const int N = 1005;struct Edge{ int v,w,next;}edge[MAXM];struct Query{ int q,next; int id;}query[MAXN];bool vis[maxn];int head[maxn],hed[maxn],father[maxn],dis[maxn],ans[maxn];int tot1,tot2,n,m;void init(){ tot1=tot2=0; memset(vis,false,sizeof(vis)); memset(head,-1,sizeof(head)); memset(hed,-1,sizeof(hed)); memset(dis,0,sizeof(dis)); for (int i=0;i<=n;i++) father[i]=i;}void addedge(int u,int v,int w){ edge[tot1].v=v; edge[tot1].w=w; edge[tot1].next=head[u]; head[u]=tot1++;}void addQuery(int u,int v,int id){ query[tot2].q=v; query[tot2].id=id; query[tot2].next=hed[u]; hed[u]=tot2++;}int find_father(int x){ if (x!=father[x]) father[x]=find_father(father[x]); return father[x];}void Union(int a,int b){ father[find_father(b)]=find_father(a);}void Tarjan(int u,int value){ vis[u]=true; dis[u]=value; for (int i=head[u];~i;i=edge[i].next) { int v=edge[i].v; if (vis[v]) continue; Tarjan(v,value+edge[i].w); Union(u,v); } for (int i=hed[u];~i;i=query[i].next) { int v=query[i].q; if (!vis[v]) continue; ans[query[i].id]=dis[u]+dis[v]-2*dis[find_father(v)]; }}int main(){#ifndef ONLINE_JUDGE freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin);#endif int i,j,t,u,v,w; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); init(); for (i=1;i<n;i++) { scanf("%d%d%d",&u,&v,&w); addedge(u,v,w); addedge(v,u,w); } for (i=0;i<m;i++) { scanf("%d%d",&u,&v); addQuery(u,v,i); addQuery(v,u,i); } Tarjan(1,0); for (i=0;i<m;i++) printf("%d\n",ans[i]); } return 0;}
0 0
- HDU 2586 - How far away ? (LCA)
- hdu 2586 How far away ?(LCA)
- HDU 2586 How far away ?(LCA)
- hdu 2586 How far away ?(LCA)
- How far away ? (hdu 2586 LCA)
- hdu 2586 How far away ?(LCA)
- HDU 2586 How far away ?(LCA)
- HDU 2586How far away ?(LCA)
- hdu-2586 How far away ?(LCA)
- HDU 2586 How far away ?(LCA)
- HDU 2586 How far away ?(lca)
- HDU 2586 How far away? LCA模板
- HDU--2586--How far away ?【LCA】
- hdu 2586 How far away ?(LCA)
- HDU - 2586 How far away ?(LCA)
- HDU---2586-How far away(LCA)
- HDU 2586 How far away ?【LCA】
- HDU 2586 How far away ?(lca)
- 【Linux学习笔记】Day1:U盘安装Debian8
- 同时持有多单和空单
- http://blog.csdn.net/u011975949/article/details/46868373
- sessionId 失效 ,后台“品”字后台跳转
- 15_09_14 English 学习
- How far away ? (hdu 2586 LCA)
- 开博MARK
- 算法系列--Climbing Stairs
- 调整数组元素的顺序使得奇数在前偶数在后并且各自有序
- select模型
- UIView 子界面的处理
- Python学习笔记1--动态类型
- 大文件处理【java以及数据清洗相关】
- XHTML表单学习总结