• hdu2586(How far away ?)


                                                       How far away ?

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

    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 经典问题:求最近公共祖先。
    //Accepted	2586	125MS	4056K	1713 B	C++
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <string>
    #include <map>
    #include <vector>
    using namespace std;
    const int maxn = 40100;
    int f[maxn];
    int d[maxn];            //保存每个节点的深度。
    
    vector<int> a[maxn];
    map<int, int> h;        //保存每个节点到其父亲边的距离。
    int n, m;
    
    void getDep(int num, int dep) {
        d[num] = dep;
        vector<int>::iterator it;
        it = a[num].begin();
        for(; it < a[num].end(); ++it) {
            getDep(*it, dep+1);
        }
    }
    
    int work(int a, int b) {
        int s1 = 0;
        int s2 = 0;
        while(a!=b) {
            while(d[a]<d[b]){
                s1 += h[b];
                b = f[b];
            }
            while(d[a]>d[b]) {
                s2 += h[a];
                a = f[a];
            }
            if(d[a]==d[b]&&a!=b) {
                s1 += h[b];
                b = f[b];
            }
        }
        return s1+s2;
    }
    
    void init() {
        for(int i = 0; i < n; i++) {
            a[i].clear();
        }
        h.clear();
    }
    
    int main()
    {
        int T;
        int u;
        scanf("%d", &T);
        int from, to, w;
        for(u = 0; u < T; u++) {
            scanf("%d%d", &n, &m);
            for(int i = 0; i < n-1; i++) {
                scanf("%d%d%d", &from, &to, &w);
                a[from].push_back(to);
                f[to] = from;
                h[to] = w;//保存每个节点到其父亲的距离
            }
            getDep(1, 0);
            //query
            for(int i = 0; i < m; i++) {
                scanf("%d%d", &from, &to);
                int res = work(from, to);
                cout << res << endl;
            }
            init();
        }
        return 0;
    }
    


  • 相关阅读:
    Git 基础
    SharePoint 2013 对象模型操作"网站设置"菜单
    SharePoint 2013 隐藏部分Ribbon菜单
    SharePoint 2013 Designer系列之数据视图筛选
    SharePoint 2013 Designer系列之数据视图
    SharePoint 2013 Designer系列之自定义列表表单
    SharePoint 2013 设置自定义布局页
    SharePoint 2013 "通知我"功能简介
    SharePoint 2013 创建web应用程序报错"This page can’t be displayed"
    SharePoint 禁用本地回环的两个方法
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3029500.html
Copyright © 2020-2023  润新知