• <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

            一、題目描述

            Cerror is the mayor of city HangZhou. As you may know, the traffic system of this city is so terrible, that there are traffic jams everywhere. Now, Cerror finds out that the main reason of them is the poor design of the roads distribution, and he want to change this situation.

            In order to achieve this project, he divide the city up to N regions which can be viewed as separate points. He thinks that the best design is the one that connect all region with shortest road, and he is asking you to check some of his designs.

            Now, he gives you an acyclic graph representing his road design, you need to find out the shortest path to connect some group of three regions.

            Input

            The input contains multiple test cases! In each case, the first line contian a interger N (1 < N < 50000), indicating the number of regions, which are indexed from 0 to N-1. In each of the following N-1 lines, there are three interger Ai, Bi, Li (1 < Li < 100) indicating there's a road with length Li between region Ai and region Bi. Then an interger Q (1 < Q < 70000), the number of group of regions you need to check. Then in each of the following Q lines, there are three interger Xi, Yi, Zi, indicating the indices of the three regions to be checked.

            Process to the end of file.

            Output

            Q lines for each test case. In each line output an interger indicating the minimum length of path to connect the three regions.

            Output a blank line between each test cases.

            Sample Input

            4
            0 1 1
            0 2 1
            0 3 1
            2
            1 2 3
            0 1 2
            5
            0 1 1
            0 2 1
            1 3 1
            1 4 1
            2
            0 1 2
            1 0 3
            

            Sample Output

            3
            2
            2
            2
            


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

              1#include<iostream>
              2#include<cmath>
              3#include<list>
              4using namespace std;
              5int n, q;
              6struct node
              7{
              8    int lab, dis;
              9    void init(int l, int d)
             10    {
             11        lab = l; dis = d;
             12    }

             13}
            ;
             14int v1, v2, v3, len;
             15list<node> g[50001];
             16int ei, e[100002], r[50001], l[100002], d[50001];
             17bool visit[50001];
             18int pow2[18];
             19int mmin[18][100002];
             20void dfs(int u, int dep)
             21{
             22    e[++ei] = u; l[ei] = dep;
             23    if(visit[u]) return;
             24    visit[u] = true;
             25    list<node>::iterator it = g[u].begin();
             26    while(it != g[u].end())
             27    {
             28        int v = it->lab, len = it->dis;
             29        if(!visit[v])
             30        {
             31            d[v] = min(d[v], d[u] + len);
             32            dfs(v, dep+1);
             33            e[++ei] = u; l[ei] = dep;
             34            
             35        }

             36        it++;
             37    }

             38}

             39void init_rmq()
             40{
             41    ei = 0;
             42    memset(visit, 0sizeof(visit));
             43    d[0= 0;
             44    dfs(01);
             45    memset(r, -1sizeof(r));
             46    for(int i=1; i<=ei; i++)
             47        if(r[e[i]] == -1)
             48            r[e[i]] = i;
             49    memset(mmin, 0sizeof(mmin));
             50    for(int i=1; i<=ei; i++)
             51        mmin[0][i] = i;
             52    int t1 = (int)(log((double)ei) / log(2.0));
             53    for(int i=1; i<=t1; i++)
             54        for(int j=1; j + pow2[i] - 1<=ei; j++)
             55        {
             56            int a = mmin[i-1][j], b = mmin[i-1][j+pow2[i-1]];
             57            if(l[a] <= l[b])
             58                mmin[i][j] = a;
             59            else
             60                mmin[i][j] = b;
             61        }

             62}

             63int rmq(int u, int v)
             64{
             65    int i = r[u], j = r[v];
             66    if(i > j) swap(i, j);
             67    int t1 = (int)(log((double)j - i + 1/ log(2.0));
             68    int a = mmin[t1][i], b = mmin[t1][j - pow2[t1] + 1];
             69    if(l[a] <= l[b])
             70        return e[a];
             71    else
             72        return e[b];
             73}

             74int main()
             75{
             76    for(int i=0; i<18; i++)
             77        pow2[i] = 1 << i;
             78    bool flag = false;
             79    while(scanf("%d"&n) != EOF)
             80    {
             81        if(flag) printf("\n");
             82        flag = true;
             83        for(int i=0; i<n; i++)
             84        {
             85            g[i].clear();
             86            d[i] = INT_MAX;
             87        }

             88        for(int i=0; i<n-1; i++)
             89        {
             90            scanf("%d%d%d"&v1, &v2, &len);
             91            node n1; n1.init(v2, len);
             92            g[v1].push_back(n1);
             93            node n2; n2.init(v1, len);
             94            g[v2].push_back(n2);
             95        }

             96        init_rmq();
             97        scanf("%d"&q);
             98        while(q--)
             99        {
            100            int res = INT_MAX;
            101            scanf("%d%d%d"&v1, &v2, &v3);
            102            int temp = 0;
            103            int lca1 = rmq(v1, v2);
            104            temp = d[v1] + d[v2] - 2*d[lca1];
            105            int lca2 = rmq(lca1, v3);
            106            temp += d[lca1] + d[v3] - 2*d[lca2];
            107            res = min(res, temp);
            108            temp = 0;
            109            lca1 = rmq(v1, v3);
            110            temp = d[v1] + d[v3] - 2*d[lca1];
            111            lca2 = rmq(lca1, v2);
            112            temp += d[v2] + d[lca1] - 2*d[lca2];
            113            res = min(res, temp);
            114            temp = 0;
            115            lca1 = rmq(v2, v3);
            116            temp = d[v2] + d[v3] - 2*d[lca1];
            117            lca2 = rmq(lca1, v1);
            118            temp += d[v1] + d[lca1] - 2*d[lca2];
            119            res = min(res, temp);
            120            printf("%d\n", res);
            121        }

            122    }

            123}
            posted on 2009-07-02 20:55 Icyflame 閱讀(1270) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            一本久久综合亚洲鲁鲁五月天| 国产成人综合久久精品尤物| 久久婷婷午色综合夜啪| 国产精品中文久久久久久久| 伊人久久精品无码av一区| 国产精品美女久久久久| yellow中文字幕久久网| 性做久久久久久久久浪潮| 国产精品久久国产精品99盘| 日日狠狠久久偷偷色综合0| 久久久免费精品re6| 热久久国产欧美一区二区精品| 欧洲人妻丰满av无码久久不卡| 久久国产高清一区二区三区| 蜜臀久久99精品久久久久久小说| 久久久久亚洲爆乳少妇无 | 久久精品视屏| 久久国产精品一国产精品金尊| 久久精品国产精品亚洲人人| 久久亚洲美女精品国产精品| 欧美粉嫩小泬久久久久久久| 久久噜噜电影你懂的| 99久久这里只精品国产免费| 久久国产精品无码网站| 99久久er这里只有精品18| 精品综合久久久久久97| 日韩va亚洲va欧美va久久| 国产精品美女久久久久av爽 | 久久亚洲国产欧洲精品一| 麻豆成人久久精品二区三区免费| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 漂亮人妻被中出中文字幕久久| 国产高潮久久免费观看| 久久99热国产这有精品| 久久精品国产91久久麻豆自制| 久久99精品久久久久久hb无码| 国产成人精品三上悠亚久久| 久久国产劲爆AV内射—百度| 久久受www免费人成_看片中文| 思思久久好好热精品国产| 久久人与动人物a级毛片|