最長k可重區間集合(24題)

2021-09-24 18:19:55 字數 1350 閱讀 6143

這題最開始再網路賽的時候遇到,第一想法是貪心或者dp,然後發現需要記錄的轉態太多了。一看區間個數又很想網路流,所以就yy出了乙個假演算法,太醜了就不說了。

這題正確的思路是 

將答案拆分成k條路徑,每條路徑滿足包含的區間之間互相沒有交集。如果將這k條路徑按照包含區間的個數排序,那麼滿足的關係就是下乙個路徑包含的區間一定被上乙個路徑的區間所包含。問題轉化為k條路徑的最大費用。

#include using namespace std;

typedef long long ll;

typedef int lint;

const int inf = 0x3f3f3f3f;

const lint maxn = 10000;

const lint maxm = 20000000;

struct mcmf

void add(int x,int y,int cap,int c)

bool spfa(int s,int t)

d[s] = 0;

vis[s] = true;

q.push(s);

while(!q.empty())}}

}if(pre[t] == -1)return false;

else return true;

}int mincost(int s,int t,int &cc)

for(int cure = pre[t];cure != -1;cure = pre[ ver[cure^1] ])

if( cc > prec )

prec = cc;

flow += mn;

}return flow;

}} g;

lint a[maxn],b[maxn];

vectorve;

void discrete()

lint h( lint x )

lint isstart[maxn];

void init()

int main()

discrete();

for( lint i = 1;i <= n;i++ )

for( lint i = 1;i <= n;i++ )

for( lint i = 1;i < ve.size();i++ )

ll ss = 0,tt = ve.size()+1;

g.add( ss,1,k,0 );g.add( ve.size(),tt,k,0 );

lint ans = 0;

g.mincost(ss,tt,ans );

cout << -ans << endl;

return 0;

}

網路流24題 最長k可重區間集(費用流)

cogs loj洛谷 首先注意一下 這道題目裡面 在cogs上直接做就行了 洛谷和loj上需要判斷資料合法,如果 l r 就要交換l,r 首先離散化 資料範圍比較大 記錄一下l,r 和區間大小 這個問題可以換一種看法 相當於從源點出發,走k次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是它們...

網路流24題 最長k可重區間集(費用流)

cogs loj洛谷 首先注意一下 這道題目裡面 在cogs上直接做就行了 洛谷和loj上需要判斷資料合法,如果 l r 就要交換 l,r 首先離散化 資料範圍比較大 記錄一下 l,r 和區間大小 這個問題可以換一種看法 相當於從源點出發,走k次,問你路徑的最大權值和 其中有些邊可以無限制的走,但是...

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

對於每個點向後乙個點連流量為k費用為0的邊 對每一區間連l到r流量為1費用為r l的邊 然後最小費用最大流,輸出取反 一開始寫的r l 1錯了半天。by 大奕哥 1 include2 using namespace std 3const int n 10000005,inf 1e9 4int hea...