1. 程式人生 > >網路流24題 21最長k可重區間集問題

網路流24題 21最長k可重區間集問題

最長k可重區間集問題

Time Limit 1000ms

Memory Limit 65536K

description

    給定實直線L 上n 個開區間組成的集合I,和一個正整數k,試設計一個演算法,從開區間集合I 中選取出開區間集合S屬於I,使得在實直線L 的任何一點x,S 中包含點x 的開區間個數不超過k,且 達到最大。這樣的集合S稱為開區間集合I的最長k可重區間集。稱為最長k可重區間集的長度。
    對於給定的開區間集合I和正整數k,計算開區間集合I的最長k可重區間集的長度。

							

input

多組資料輸入.
每組輸入第1 行有2 個正整數n和k,分別表示開區間的個數和開區間的可重迭數。接下來的n行,每行有2個整數,表示開區間的左右端點座標。

output

每組輸出最長k可重區間集的長度

							

sample_input

4 2
1 7
6 8
7 10
9 13

							

sample_output

15
----------------------------------------------

【問題分析】


最大權不相交路徑問題,可以用最大費用最大流解決。


【建模方法】


方法1


按左端點排序所有區間,把每個區間拆分看做兩個頂點<i.a><i.b>,建立附加源S匯T,以及附加頂點S'。


1、連線S到S'一條容量為K,費用為0的有向邊。
2、從S'到每個<i.a>連線一條容量為1,費用為0的有向邊。
3、從每個<i.b>到T連線一條容量為1,費用為0的有向邊。
4、從每個頂點<i.a>到<i.b>連線一條容量為1,費用為區間長度的有向邊。
5、對於每個區間i,與它右邊的不相交的所有區間j各連一條容量為1,費用為0的有向邊。


求最大費用最大流,最大費用流值就是最長k可重區間集的長度。


方法2


離散化所有區間的端點,把每個端點看做一個頂點,建立附加源S匯T。


1、從S到頂點1(最左邊頂點)連線一條容量為K,費用為0的有向邊。
2、從頂點2N(最右邊頂點)到T連線一條容量為K,費用為0的有向邊。
3、從頂點i到頂點i+1(i+1<=2N),連線一條容量為無窮大,費用為0的有向邊。
4、對於每個區間[a,b],從a對應的頂點i到b對應的頂點j連線一條容量為1,費用為區間長度的有向邊。


求最大費用最大流,最大費用流值就是最長k可重區間集的長度。


【建模分析】


這個問題可以看做是求K條權之和最大的不想交路徑,每條路徑為一些不相交的區間序列。由於是最大費用流,兩條路徑之間一定有一些區間相交,可以看做事相交部分重複了2次,而K條路經就是最多重複了K次。最簡單的想法就是把區間排序後,不相交的區間之間連線一條邊,由於每個區間只能用一次,所以要拆點,點內限制流量。如果我們改變一下思路,把端點作為網路中的頂點,區間恰恰是特定一些端點之間的邊,這樣建模的複雜度更小。方法1的邊數是O(N^2)的,而方法2的邊數是O(N)的,可以解決更大規模的問題。