LCA-hdu2586 how-far-away

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.

InputFirst 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.OutputFor 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就是个并查集的模拟,但有一种倍增LCA,用一个二位数组储存每个点祖先们的情况,然后按二进制从高位跑LCA,可以把复杂度降到nlogn,不过要注意这样得到的第一个可能不是最近的,要向下试探。
const int MAX=0x7ffffff;
struct r{
    int fa,len;
};
r fa[40005];
int len[40005];
map<int,int>qi;
void solve()
{
    int n,i,j,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) fa[i].fa=i,fa[i].len=0;
    for(i=1;i<n;i++){
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
    //    if(a>b) swap(a,b);
        fa[a].fa=b;
        fa[a].len=c;
    }
        
    while(m--){
        int a,b,sum(0);
        cin>>a>>b;
        qi.clear();
        sum=0;
        qi[a]=sum;
        while(fa[a].fa!=a){
            sum+=fa[a].len;
            a=fa[a].fa;
            qi[a]=sum;
        } 
        qi[a]=sum;
        sum=0;
    //    cout<<qi[a]<<endl;
        while(qi.count(b)==0) {
            
            sum+=fa[b].len;
            b=fa[b].fa;
        //    cout<<":"<<b<<endl;
        }
        sum+=qi[b];
        cout<<sum<<endl;
        
    }
    
}

 

posted @ 2019-06-08 16:55  wengsy150943  阅读(156)  评论(0)    收藏  举报