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

            TC SRM144DIV2 千分題題解

            這道千分題,其實是挺有意思的一題:
            提供了點(這里是junction)和點之間的距離(或代價);
            要求以最短的距離(或最小代價)遍歷所有的點,同時每個點可以多次訪問;

            初看之下,給人的感覺是圖論相關的問題,比如旅行者問題、歐拉環(huán)游之類。

            在思考這個問題的時候,忽然間聯(lián)想到了圖論中的最小生成樹,雖然并不是真正要去得出最小生成樹,

            但是按照最小生成樹所提供的思路--這點很重要--那就是圖和樹之間有著相當密切的關系:即使最小生

            成樹并不能直接解決這個問題,但是它們之間存在的這層關系的確提供了解決問題的一個有益的嘗試方

            向;

            于是,思考進了一步,問題從“圖”簡化成了“樹”--如何把當前這個問題采用樹的結構和方法表達出

            來:樹的根節(jié)點,很自然地想到了由問題中旅行的起始節(jié)點來表達;然后,隨著節(jié)點的不斷加入,樹就

            自然地生成,此處的關鍵在于如何生成,或者說節(jié)點加入的規(guī)則,以及每個節(jié)點為了適應這個規(guī)則,所

            必須持有的相關屬性信息:最直接的,父子節(jié)點之間的關系需要維護,從父節(jié)點到子節(jié)點的距離(或代

            價)必須要保留,其次,考慮到如果每個節(jié)點都維護相關的距離(代價)信息,那么從當前節(jié)點到根節(jié)

            點的代價也就可以由此遞推得出,進一步,我們所要求出的最短路徑(或最小代價)不就可以從上述這

            些節(jié)點中維護的距離信息中得出嗎?這是非常關鍵的一步,它把當前我們構建的數(shù)據(jù)結構和問題的要求

            之間建立起了相當直接的聯(lián)系。這說明我們目前思考的方向是有價值的而且極有可能順著這個方向前行

            ,可以得出相當不錯的結果。

            顯然,既然要求最短路徑(最小代價),那么我們目前構建出的這顆Junction樹(因為其上的節(jié)點在題

            中的物理含義是代表Junction,那這里我們就姑且稱其為Junction Tree),樹上的每個節(jié)點也應當保留

            在其之下的子樹的最短路徑(最小代價),這就相當于把每個節(jié)點都作為根節(jié)點,然后求出各條子路徑

            的代價,并比較得出最短路徑(最小代價),以及在這條最短路徑上的直接子節(jié)點;

            每加入一個子節(jié)點,就要對上述已構建出的這些數(shù)據(jù)結構中的信息進行維護,以調整每個節(jié)點當前的最

            短路徑代價和相應這條路徑上的直接子節(jié)點;當所有原“圖”中的“邊”信息,也就是

            (fromJunction,toJuction,ductLength)所代表的(起始點,終止點,長度代價),都按照上述方案加入

            Juction Tree之后,我們可以知道從最初的起始節(jié)點(也就是Junction Tree的根節(jié)點)到最終節(jié)點的(

            Junction Tree上的某條路徑上的葉子節(jié)點)的最短(最小代價)路徑了。

            對于Juction Tree這個ADT抽象數(shù)據(jù)結構的具體實現(xiàn),考慮到優(yōu)先隊列中二叉堆的經典實現(xiàn)往往使用數(shù)組

            ,同時也為了符合TC SRM一貫的簡捷明快的程序設計風格,我們這里同時使用幾個數(shù)組來維護前述構建

            出的數(shù)據(jù)結構。

            //////////////////////////////////////////////////////////////////////////////////////////

            #include<cstdlib>
            #include<vector>
            #include<set>
            using namespace std;

            const int NIL = -1;
            const int MAX = 50;

            int Cost[MAX];
            int ParentNode[MAX];
            int MaxSubNode[MAX];
            int MaxSubCost[MAX];

            class PowerOutage
            {
            public:
             int estimateTimeOut(vector<int> fromJunction, vector<int> toJunction, vector<int>

            ductLength)
             {
              if (!CheckParameter(fromJunction, toJunction, ductLength)) return NIL;
              
              Ini();
              int count = fromJunction.size();
              for (int i = 0; i < count; i++)
              {
               AddNode(fromJunction[i], toJunction[i], ductLength[i]);
              }
              
              return CalculateMinCost(fromJunction, toJunction, ductLength);
             }
            private:
             void Ini()
             {
              memset(Cost, NIL, sizeof(int) * MAX);
              memset(ParentNode, NIL, sizeof(int) * MAX);
              memset(MaxSubNode, NIL, sizeof(int) * MAX);
              memset(MaxSubCost, 0, sizeof(int) * MAX);
             }
             
             bool CheckParameter(const vector<int>& fromJunction, const vector<int>& toJunction,

            const vector<int>& ductLength)
             {
              if (fromJunction.size() != toJunction.size() || toJunction.size() !=

            ductLength.size())
               return false;
              return true;
             }
             
             void AddNode(int parent, int child, int cost)
             {
              if (parent < 0 || child < 0 || cost < 0) return;
              
              Cost[child] = cost;
              ParentNode[child] = parent;
              
              int curParent = parent, curChild = child;
              bool adjustParentCost = true;
              while (adjustParentCost && curParent != NIL)
              {
               int candidateParentMaxSubCost = Cost[curChild] + MaxSubCost

            [curChild];
               if (MaxSubCost[curParent] < candidateParentMaxSubCost)
               {
                MaxSubCost[curParent] = candidateParentMaxSubCost;
                MaxSubNode[curParent] = curChild;
                
                curChild = curParent;
                curParent = ParentNode[curParent];
               }
               else
               {
                adjustParentCost = false;
               }
              }
             }
             
             int CalculateMinCost(const vector<int>& fromJunction, const vector<int>&

            toJunction, const vector<int>& ductLength)
             {
              int len = fromJunction.size();
              int minCost = 0;
              
              set<int> minCostPath;
              minCostPath.insert(0);
              int curNode = MaxSubNode[0];
              while(curNode != NIL)
              {
               printf("%d;",curNode); // print the min cost path
               
               minCostPath.insert(curNode);
               curNode = MaxSubNode[curNode];
              }
              
              for (int i = 0; i < len; i++)
              {
               if (minCostPath.find(toJunction[i]) == minCostPath.end())
                minCost += 2 * ductLength[i];
               else
                minCost += ductLength[i];
              }
              
              return minCost;
             }
            };

            posted on 2011-02-27 17:09 flagman 閱讀(1617) 評論(0)  編輯 收藏 引用 所屬分類: 算法 Algorithm 、數(shù)據(jù)結構 Data Structure

            <2025年8月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            31123456

            導航

            統(tǒng)計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            亚洲综合伊人久久综合| 伊人久久大香线蕉AV色婷婷色| 色综合久久天天综合| 合区精品久久久中文字幕一区| 国产精品美女久久久久AV福利 | 91久久精品电影| 久久久一本精品99久久精品88| 91亚洲国产成人久久精品| 国产A级毛片久久久精品毛片| 国产免费久久精品丫丫| 精品国产乱码久久久久久1区2区| 久久久久国产| 精品久久久久久综合日本| 久久中文字幕精品| 久久天天躁狠狠躁夜夜2020老熟妇| 久久人人爽爽爽人久久久| 久久久久久亚洲精品影院| 91精品国产91久久| 久久精品一区二区国产| 久久综合香蕉国产蜜臀AV| 亚洲国产精品无码久久SM| 国产精品一区二区久久精品涩爱| 久久久网中文字幕| 国内精品久久久久久久久| 伊人热人久久中文字幕| 国产精品一久久香蕉产线看| 久久久一本精品99久久精品66| 精品综合久久久久久97| 国产亚洲精品久久久久秋霞| 久久久SS麻豆欧美国产日韩| 国产亚洲精品久久久久秋霞| 伊人久久精品无码二区麻豆| 狠狠综合久久综合88亚洲| 国产精品乱码久久久久久软件| 久久久久亚洲AV成人网人人网站| 精品无码久久久久国产动漫3d| 国产成人精品综合久久久久| 久久精品亚洲精品国产色婷| www.久久热| 久久久久国产一区二区| 国产99久久久国产精品小说|