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

            The Fourth Dimension Space

            枯葉北風寒,忽然年以殘,念往昔,語默心酸。二十光陰無一物,韶光賤,寐難安; 不畏形影單,道途阻且慢,哪曲折,如渡飛湍。斬浪劈波酬壯志,同把酒,共言歡! -如夢令

            PKU 1149, PIGS,構造網絡流模型時,要注意合并節點和邊(轉)

                這道題目的大意是這樣的:
            • 有 M 個豬圈(M ≤ 1000),每個豬圈里初始時有若干頭豬。
            • 一開始所有豬圈都是關閉的。
            • 依次來了 N 個顧客(N ≤ 100),每個顧客分別會打開指定的幾個豬圈,從中買若干頭豬。
            • 每個顧客分別都有他能夠買的數量的上限。
            • 每個顧客走后,他打開的那些豬圈中的豬,都可以被任意地調換到其它開著的豬圈里,然后所有豬圈重新關上。
                問總共最多能賣出多少頭豬。

                舉個例子來說。有 3 個豬圈,初始時分別有 3、 1 和 10 頭豬。依次來了 3 個顧客,第一個打開 1 號 和 2 號豬圈,最多買 2 頭;第二個打開 1 號 和 3 號豬圈,最多買 3 頭;第三個打開 2 號豬圈,最多買 6 頭。那么,最好的可能性之一就是第一個顧客從 1 號圈買 2 頭,然后把 1 號圈剩下的 1 頭放到 2 號圈;第二個顧客從 3 號圈買 3 頭;第三個顧客從 2 號圈買 2 頭。總共賣出 2 + 3 + 2 = 7 頭。□

                不難想像,這個問題的網絡模型可以很直觀地構造出來。就拿上面的例子來說,可以構造出圖 1 所示的模型(圖中凡是沒有標數字的邊,容量都是 +∞):
            • 三個顧客,就有三輪交易,每一輪分別都有 3 個豬圈和 1 個顧客的節點。
            • 從源點到第一輪的各個豬圈各有一條邊,容量就是各個豬圈里的豬的初始數量。
            • 從各個顧客到匯點各有一條邊,容量就是各個顧客能買的數量上限。
            • 在某一輪中,從該顧客打開的所有豬圈都有一條邊連向該顧客,容量都是 +∞。
            • 最后一輪除外,從每一輪的 i 號豬圈都有一條邊連向下一輪的 i 號豬圈,容量都是 +∞,表示這一輪剩下的豬可以留到下一輪。
            • 最后一輪除外,從每一輪被打開的所有豬圈,到下一輪的同樣這些豬圈,兩兩之間都要連一條邊,表示它們之間可以任意流通。



            圖 1

                不難想像,這個網絡模型的最大流量就是最多能賣出的數量。圖中最多有 2 + N + M × N ≈ 100,000 個節點。□

                這個模型雖然很直觀,但是節點數太多了,計算速度肯定會很慢。其實不用再想別的算法,就讓我們繼續上面的例子,用合并的方法來簡化這個網絡模型。

                首先,最后一輪中沒有打開的豬圈就可以從圖中刪掉了,也就是圖 2紅色的部分,顯然它們對整個網絡的流量沒有任何影響。



            圖 2

                接著,看圖 2藍色的部分。根據我總結出的以下幾個規律,可以把這 4 個點合并成一個:

                規律 1. 如果幾個節點的流量的來源完全相同,則可以把它們合并成一個。

                規律 2. 如果幾個節點的流量的去向完全相同,則可以把它們合并成一個。

                規律 3. 如果從點 u 到點 v 有一條流容量為 +∞ 的邊,并且點 v 除了點 u 以外沒有別的流量來源,則可以把這兩個節點合并成一個。

                根據規律 1,可以把藍色部分右邊的 1、 2 號節點合并成一個;根據規律 2,可以把藍色部分左邊的 1、 2 號節點合并成一個;最后,根據規律 3,可以把藍色部分的左邊和右邊(已經分別合并成了一個節點)合并成一個節點。于是,圖 2 被簡化成了圖 3 的樣子。也就是說,最后一輪除外,每一輪被打開的豬圈和下一輪的同樣這些豬圈都可以被合并成一個點。



            圖 3

                接著,根據規律 3圖 3 中的藍色節點、2 號豬圈和 1 號顧客這三點可以合并成一個;圖 3 中的兩個 3 號豬圈和 2 號顧客也可以合并成一個點。當然,如果兩點之間有多條同向的邊,則這些邊可以合并成一條,容量相加,這個道理很簡單,就不用我多說了。最終,上例中的網絡模型被簡化成了圖 4 的樣子。□


            圖 4

                讓我們從圖 4 中重新總結一下構造這個網絡模型的規則:
            • 每個顧客分別用一個節點來表示。
            • 對于每個豬圈的第一個顧客,從源點向他連一條邊,容量就是該豬圈里的豬的初始數量。如果從源點到一名顧客有多條邊,則可以把它們合并成一條,容量相加。
            • 對于每個豬圈,假設有 n 個顧客打開過它,則對所有整數 i ∈ [1, n),從該豬圈的第 i 個顧客向第 i + 1 個顧客連一條邊,容量為 +∞。
            • 從各個顧客到匯點各有一條邊,容量是各個顧客能買的數量上限。
                拿我們前面一直在講的例子來說:1 號豬圈的第一個顧客是 1 號顧客,所以從源點到 1 號顧客有一條容量為 3 的邊;1 號豬圈的第二個顧客是 2 號顧客,因此從 1 號顧客到 2 號顧客有一條容量為 +∞ 的邊;2 號豬圈的第一個顧客也是 1 號顧客,所以從源點到 1 號顧客有一條容量為 1 的邊,和之前已有的一條邊合并起來,容量變成 4;2 號豬圈的第二個顧客是 3 號顧客,因此從 1 號顧客到 3 號顧客有一條容量為 +∞ 的邊;3 號豬圈的第一個顧客是 2 號顧客,所以從源點到 2 號顧客有一條容量為 10 的邊。□

                新的網絡模型中最多只有 2 + N = 102 個節點,計算速度就可以相當快了。可以這樣理解這個新的網絡模型:對于某一個顧客,如果他打開了豬圈 h,則在他走后,他打開的所有豬圈里剩下的豬都有可能被換到 h 中,因而這些豬都有可能被 h 的下一個顧客買走。所以對于一個顧客打開的所有豬圈,從該顧客到各豬圈的下一個顧客,都要連一條容量為 +∞ 的邊。

                在面對網絡流問題時,如果一時想不出很好的構圖方法,不如先構造一個最直觀,或者說最“硬來”的模型,然后再用合并節點和邊的方法來簡直化這個模型。經過簡化以后,好的構圖思路自然就會涌現出來了。這是解決網絡流問題的一個好方法。


            轉自:http://imlazy.ycool.com/post.2059102.html

            posted on 2009-07-12 06:42 abilitytao 閱讀(213) 評論(0)  編輯 收藏 引用

            久久精品国产第一区二区| 久久AV高清无码| 香蕉久久影院| 亚洲乱码精品久久久久..| 久久精品国产精品青草app| 国产精品一区二区久久精品无码| 青青草国产97免久久费观看| 区亚洲欧美一级久久精品亚洲精品成人网久久久久 | 99久久综合国产精品免费| 日韩久久久久中文字幕人妻 | 久久免费视频1| 久久亚洲精品无码AV红樱桃| 国产叼嘿久久精品久久| 亚洲乱码精品久久久久..| 亚洲国产成人久久精品影视| 超级97碰碰碰碰久久久久最新| 精品久久久久久久| 婷婷久久香蕉五月综合加勒比| 狠狠色婷婷综合天天久久丁香| 国产精品久久久天天影视香蕉 | 久久免费美女视频| 亚洲日本va中文字幕久久| 久久久久夜夜夜精品国产| 久久亚洲私人国产精品| 国产精品乱码久久久久久软件| 免费一级欧美大片久久网 | 久久久精品波多野结衣| 久久99精品久久只有精品| 久久精品国产99久久久古代| 精品久久久无码中文字幕天天| 亚洲精品国产成人99久久| 无遮挡粉嫩小泬久久久久久久| 国产精品亚洲综合久久| 久久久久久亚洲精品不卡| 国产亚州精品女人久久久久久| 99精品久久精品| 国产高潮国产高潮久久久| 波多野结衣中文字幕久久| 精品综合久久久久久97超人| 久久99精品国产自在现线小黄鸭| 亚洲精品国产美女久久久|