• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 18,  comments - 5,  trackbacks - 0

            一、題目描述

            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
            2 2
            1 2 100
            1 2
            2 1
             


             

            Sample Output
            10
            25
            100
            100


            二、分析
                  用Tarjan解決的LCA問題,詳細算法:LCA問題
            三、代碼

             1#include<iostream>
             2#include<list>
             3using namespace std;
             4struct node
             5{
             6    int v, d;
             7    void init(int vv, int dd) {v = vv; d = dd;}
             8}
            ;
             9int t, n, m, v1, v2, len;
            10list<node> g[40001];
            11list<node> query[40001];
            12int dis[40001];
            13int res[201][3];
            14int parent[40001];
            15bool visit[40001];
            16int find(int k)
            17{
            18    if(parent[k] == k)
            19        return k;
            20    return parent[k] = find(parent[k]);
            21}

            22void tarjan(int u)
            23{
            24    if(visit[u]) return;
            25    visit[u] = true;
            26    parent[u] = u;
            27    list<node>::iterator it = query[u].begin();
            28    while(it != query[u].end())
            29    {
            30        if(visit[it->v])
            31            res[it->d][2= find(it->v);
            32        it++;
            33    }

            34    it = g[u].begin();
            35    while(it != g[u].end())
            36    {
            37        if(!visit[it->v])
            38        {
            39            dis[it->v] = min(dis[it->v], dis[u] + it->d);
            40            tarjan(it->v);
            41            parent[it->v] = u;
            42        }

            43        it++;
            44    }

            45}

            46int main()
            47{
            48    scanf("%d"&t);
            49    while(t--)
            50    {
            51        scanf("%d%d"&n, &m);
            52        for(int i=1; i<=n; i++)
            53            g[i].clear();
            54        for(int i=1; i<=m; i++)
            55            query[i].clear();
            56        for(int i=1; i<n; i++)
            57        {
            58            scanf("%d%d%d"&v1, &v2, &len);
            59            node n1; n1.init(v2, len);
            60            g[v1].push_back(n1);
            61            node n2; n2.init(v1, len);
            62            g[v2].push_back(n2);
            63        }

            64        for(int i=1; i<=m; i++)
            65        {
            66            scanf("%d%d"&v1, &v2);
            67            res[i][0= v1;
            68            res[i][1= v2;
            69            node n1; n1.init(v2, i);
            70            query[v1].push_back(n1);
            71            node n2; n2.init(v1, i);
            72            query[v2].push_back(n2);
            73        }

            74        memset(visit, 0sizeof(visit));
            75        memset(dis, 0x7fsizeof(dis));
            76        dis[1= 0;
            77        tarjan(1);
            78        for(int i=1; i<=m; i++)
            79            printf("%d\n", dis[res[i][0]] + dis[res[i][1]] - 2*dis[res[i][2]]);
            80    }

            81}
            posted on 2009-07-02 22:39 Icyflame 閱讀(1311) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            99久久精品国产一区二区| 久久精品亚洲福利| 996久久国产精品线观看| 久久夜色精品国产噜噜噜亚洲AV | 国产婷婷成人久久Av免费高清 | 免费精品国产日韩热久久| 一本色道久久88综合日韩精品| 久久婷婷五月综合色奶水99啪| 无码伊人66久久大杳蕉网站谷歌| 久久精品草草草| 2019久久久高清456| 久久免费精品视频| 中文字幕精品无码久久久久久3D日动漫| 久久精品国产AV一区二区三区| 热久久这里只有精品| 一级做a爰片久久毛片免费陪| 久久久青草久久久青草| 久久久久久久久波多野高潮| 国产巨作麻豆欧美亚洲综合久久 | 九九热久久免费视频| 久久香综合精品久久伊人| 日产久久强奸免费的看| 99精品久久久久久久婷婷| 亚洲AV无码久久精品狠狠爱浪潮 | 久久久精品波多野结衣| 99久久99久久| 97热久久免费频精品99| 久久亚洲AV成人无码软件| 日韩一区二区三区视频久久| 国产99久久九九精品无码| 久久久中文字幕| 日本三级久久网| 99久久精品无码一区二区毛片| 久久精品中文闷骚内射| 久久久久亚洲AV片无码下载蜜桃| 一本色综合网久久| 亚洲AV无码成人网站久久精品大| 久久亚洲熟女cc98cm| 亚洲国产另类久久久精品| 婷婷久久久亚洲欧洲日产国码AV| 国产精品久久久久久久app|