KM演算法的幾個例題

2021-06-22 12:55:50 字數 964 閱讀 9266

例題1:給出n個白點和n個黑點的座標,要求用n條不相交得線段把他們連線起來,其中每條線段恰好連線乙個白點和乙個黑點,每個點恰好連線到一條線段

分析:因為結點有黑色和白色,我們不難想到構造乙個二分圖,其中每個白點對應乙個x結點,每個黑點對應y結點,每個黑點與乙個白點相連,權值等於二者的歐幾里得距離。建模之後,權值最小的完美匹配是問題的解。為什麼呢?假設在最佳完美匹配中有兩條線段a1-b1與a2-b2相交,那麼dis(a1,b1)+dis(a2,b2)一定大於dis(a1,b2)+dis(a2,b1),因此如果把這兩條線段給成a1-b2和a2-b1後總長度會變小,與權值最小的完美匹配矛盾。

例題2:早期的多程式作業系統常把所有的可用記憶體劃分成一些大小固定的區域,不同的區域一般大小不同,而所有的區域的大小之和為可用記憶體的大小。給定一些程式,作業系統需要給每個程式分配乙個區域,使得他們可以同時執行。可是每個程式的執行時間可能和它所占有的記憶體區域大小有關,因此排程並不容易。計算最優的記憶體分配策略,即給定m個區域的大小和n個程式在各種記憶體環境下的執行時間,找出乙個排程方案,使得平均迴轉時間(平均結束時間)盡量小。具體來說,你需要給每個程式分配乙個區域,使得沒有兩個程式在同一時間執行在同乙個記憶體區域中,而所有程式分配的區域大小都不小於該程式的最低記憶體需求。程式對記憶體的需求不會超過最大記憶體塊的大小。

分析:先來看乙個記憶體區域的情況。假設在這個記憶體區域按順序執行的k個程式的執行時間分別為t1,t2,t3,...,tk,那麼第i個程式的迴轉時間為ri=t1+t2+t3+....+ti。換句話說,如果程式i是記憶體區域j的倒數第p個執行的程式,則他對於總迴轉時間的貢獻值為pt(i,j),其中t(i,j)為程式i在記憶體區域j中的執行時間。

這樣一來,演算法就比較明顯了。構造二分圖g,x結點為n個程式,y結點為n*m個位置,其中位置(i,j)表示第i個記憶體區域的倒數第j個執行程式。接下來就是求最小權匹配即可。注意,並不是每個匹配都對應乙個合法的方案,比如,乙個區域不能只有倒數第二個程式,而沒有倒數第乙個程式。但是最佳匹配一定對應乙個合法方案。(反證法)

遞迴 幾個例題

構造遞迴樹來解決問題 從 1 n 這 n 個整數中隨機選取任意多個,輸出所有可能的選擇方案。輸入格式 輸入乙個整數n。輸出格式 每行輸出一種方案。同一行內的數必須公升序排列,相鄰兩個數用恰好1個空格隔開。對於沒有選任何數的方案,輸出空行。本題有自定義校驗器 spj 各行 不同方案 之間的順序任意。資...

陣列的幾個例題練習

例1 定義乙個長度為10的陣列,迴圈輸入10個整數。然後將輸入乙個整數,查詢此整數,找到 輸出下標,沒找到給出提示。var aa var bb 0,1,2,3,4,5,6,7,8,9 for i 0 i 10 i document.write aa var x prompt 輸入乙個已經輸入的整數 ...

KM演算法及一道例題

這道題乍一看沒有什麼性質,但是我們眾所周知也很容易推出來的有乙個性質 這種矩陣的每一項a i j 是可以表示成a i b j 的 也就是說我們可以構建乙個二分圖 對於a i j 左邊的點i向右邊的點j建一條權值為a i j 的邊 我們現在的要求是對於每 一條邊,要求它兩邊的點權必須加起來大於等於邊權...