洛谷3358 最長k可重區間集問題(費用流)

2022-05-14 13:41:52 字數 983 閱讀 4596

點此看題面

說實話,這種題型是我長久以來一直很想知道怎麼做的,果然網路流二十四題真的是經典好題。

我們可以把原題面改成選擇\(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可重區間集的長度輸出 輸入樣例 ...