網路流24題 21最長k可重區間集問題
最長k可重區間集問題 |
||
|
||
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)的,可以解決更大規模的問題。