• <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 閱讀(1278) 評論(0)  編輯 收藏 引用 所屬分類: 解題報告
            婷婷久久综合九色综合绿巨人| 中文字幕日本人妻久久久免费| 久久99久久99小草精品免视看 | 久久久亚洲欧洲日产国码二区| 新狼窝色AV性久久久久久| 国产一区二区三区久久| 久久九九久精品国产免费直播| 狠狠综合久久综合88亚洲| 久久超碰97人人做人人爱| 欧美一级久久久久久久大| 99久久精品国产免看国产一区| 久久综合亚洲色HEZYO国产| 精品久久久久久无码专区| 亚洲婷婷国产精品电影人久久| 久久久久久久久久久| 久久www免费人成精品香蕉| A狠狠久久蜜臀婷色中文网| 国产69精品久久久久9999APGF| 97精品伊人久久久大香线蕉| 久久99精品久久只有精品| 99久久精品国产一区二区 | 国产精品嫩草影院久久| 亚洲国产精品无码久久| 伊人久久成人成综合网222| 热99re久久国超精品首页| 久久er99热精品一区二区| 久久精品国产99久久久古代| 久久国内免费视频| 午夜精品久久久久久影视777| 狠狠色丁香婷婷综合久久来来去 | 日本精品久久久久久久久免费| 天天久久狠狠色综合| 精品少妇人妻av无码久久| 久久久久亚洲AV无码永不| 亚洲国产精品无码久久SM | 久久久久久国产精品免费免费| 日本精品久久久久中文字幕| 亚洲欧美日韩精品久久| 久久国产精品一区| 亚洲国产精品无码久久九九| 麻豆av久久av盛宴av|