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...