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.
 

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
原创粉丝点击