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

2022-03-20 08:16:29 字數 1566 閱讀 1307

cogs

loj洛谷

首先注意一下

這道題目裡面

在cogs上直接做就行了

洛谷和loj上需要判斷資料合法,如果\(l>r\)就要交換\(l,r\)

首先離散化

資料範圍比較大

記錄一下\(l,r\)和區間大小

這個問題可以換一種看法

相當於從源點出發,走k次,

問你路徑的最大權值和

其中有些邊可以無限制的走,但是它們的長度為0

所以從源點開始到匯點,掛出一條鏈來

容量為k,費用為0

這些路是可以隨便走的

另外,還有若干個區間

但是每個只能走一次

因此,直接把相應的區間連起來,容量為1,費用為長度

這樣的話,控制了流最多為k

跑一邊最大費用流就是答案啦

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define max 5000

#define maxl 500000

#define inf 1000000000

inline int read()

struct line

e[maxl];

bool vis[max];

int h[max],cnt=2;

inline void add(int u,int v,int w,int fy)

;h[u]=cnt++;

e[cnt]=(line);h[v]=cnt++;

}int pe[max],pr[max],dis[max];

int s,t,cost,n,m,flow,opt=-1;

bool spfa()

}vis[u]=false;

}if(dis[t]>=inf)return false;

int flow=inf;

for(int i=t;i!=s;i=pr[i])flow=min(flow,e[pe[i]].w);

for(int i=t;i!=s;i=pr[i])e[pe[i]].w-=flow,e[pe[i]^1].w+=flow;

cost+=opt*flow*dis[t];

flow+=flow;

return true;

}struct iq[max];

int sta[max],tot=0,k;

int main()

sort(&sta[1],&sta[tot+1]);

tot=unique(&sta[1],&sta[tot+1])-sta-1;

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

s=0;t=tot+1;

for(int i=0;ifor(int i=1;i<=n;++i)add(q[i].l,q[i].r,1,-q[i].v);

while(spfa());

printf("%d\n",cost);

return 0;

}

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

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

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

傳送門 考試的時候想到了費用流的一點東西,但是沒有寫出來,現在看來建圖也挺簡單的。s向1,n向t分別連一條容量為k,費用為0的邊,表示最多可以重疊k次 每個點向下乙個點連一條容量為inf,費用為0的邊,表示一種連線關係 對於每個區間,左端點向右端點連邊,容量為1,費用為區間長度 求最大費用最大流即可...

網路流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...