點此看題面
說實話,這種題型是我長久以來一直很想知道怎麼做的,果然網路流二十四題真的是經典好題。
我們可以把原題面改成選擇\(k\)次,每次可以選擇任意個不相交的區間。
為了實現選\(k\)次,我們需要從超級源向第乙個點連一條容量為\(k\)、價值為\(0\)的邊。
然後,我們從座標軸上每個點向相鄰的下乙個點(最後乙個點向超級匯)連一條容量為\(k\)、價值為\(0\)的邊,表示一次選擇的兩個區間之間可以不連續。
對於選乙個區間的情況,我們從這個區間的左端點向右端點連一條容量為\(1\)、價值為區間長度的邊,因為選擇這個區間就不能再選與它有交的其他區間。
然後跑一遍費用流就結束了。
#include#define tp template#define ts template#define reg register
#define ri reg int
#define con const
#define ci con int&
#define i inline
#define w while
#define n 500
#define inf (int)1e9
using namespace std;
int n,k,a[n+5],b[n+5],dc,dv[n+5];
class mincostmaxflow
e[2*es+5];
int lst[ps+5],iq[ps+5],f[ps+5],c[ps+5];queueq;
i bool spfa()//spfa求增廣路
return f[t]^inf;
} public:
i void add(ci x,ci y,ci f,ci c)//建邊
i int mcmf()//最大費用最大流
return g;
}}d;
int main()
洛谷P3358 最長k可重區間集問題 費用流
對於給定的開區間集合 i 和正整數 k,計算開區間集合 i 的最長 k可重區間集的長度。輸入格式 的第 1 行有 2 個正整數 n和 k,分別表示開區間的個數和開區間的可重迭數。接下來的 n行,每行有 2 個整數,表示開區間的左右端點座標。輸出格式 將計算出的最長 k可重區間集的長度輸出 輸入樣例 ...
P3358 最長k可重區間集問題
題目鏈結 輸入最多500個點對,即離散化後最多有1000個座標。對離散化後的座標建圖。方法一 將座標從小到大連邊,乙個點與它後面相鄰的點建一條邊 流量為inf,花費為0 點對的左端點與右端點建一條邊 流量為1,花費為 區間長度 s與第乙個點建一條邊 流量為k,花費為0 最後乙個點與t建一條邊 流量為...
最長k可重區間集
對於給定的開區間集合 i 和正整數 k,計算開區間集合 i 的最長 k可重區間集的長度。輸入格式 的第 1 行有 2 個正整數 n和 k,分別表示開區間的個數和開區間的可重迭數。接下來的 n行,每行有 2 個整數,表示開區間的左右端點座標。輸出格式 將計算出的最長 k可重區間集的長度輸出 輸入樣例 ...