• <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)和點之間的距離(或代價);
            要求以最短的距離(或最小代價)遍歷所有的點,同時每個點可以多次訪問;

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

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

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

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

            向;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            對于Juction Tree這個ADT抽象數據結構的具體實現,考慮到優先隊列中二叉堆的經典實現往往使用數組

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

            出的數據結構。

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

            #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數據結構 Data Structure

            <2011年2月>
            303112345
            6789101112
            13141516171819
            20212223242526
            272812345
            6789101112

            導航

            統計

            常用鏈接

            留言簿(1)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            狠狠色丁香婷综合久久| 午夜精品久久久久久久无码| 久久久精品人妻一区二区三区蜜桃 | 浪潮AV色综合久久天堂| 久久国产欧美日韩精品| 久久久久久久亚洲精品| 乱亲女H秽乱长久久久| 九九久久精品无码专区| 久久久噜噜噜久久中文福利| 久久久久久极精品久久久| 色婷婷综合久久久中文字幕| 国内精品久久久久久久coent | 亚洲狠狠婷婷综合久久蜜芽| 久久精品国产亚洲av高清漫画| 国产精品欧美亚洲韩国日本久久| 无码久久精品国产亚洲Av影片| 久久久精品久久久久久| 99久久免费国产特黄| 久久久精品人妻一区二区三区蜜桃| 久久亚洲中文字幕精品有坂深雪 | 久久这里有精品| 久久九九全国免费| 久久亚洲美女精品国产精品| 久久久久亚洲国产| 久久综合久久综合亚洲| 国产激情久久久久影院| 91精品国产综合久久四虎久久无码一级| 久久综合亚洲鲁鲁五月天| 亚洲七七久久精品中文国产| 精品一久久香蕉国产线看播放| 99久久99久久精品国产片果冻| 国产精品久久久久久久久鸭| 亚洲精品乱码久久久久66| 久久九九兔免费精品6| 久久国产精品无| 国内精品综合久久久40p| 99久久夜色精品国产网站 | 国内精品人妻无码久久久影院| 狠狠色婷婷久久综合频道日韩 | 青青草原综合久久| www亚洲欲色成人久久精品|