poj 3680(最小費用流)

2021-08-04 23:15:28 字數 1495 閱讀 9002

傳送門

問題:數軸上有若干個帶權值的閉區間(劉汝佳藍書p367寫的是左閉右開區間,個人根據樣例資料和解法推測應該是筆誤),選出一些區間使權值和盡量大且任意乙個數均被覆蓋k次

題解:經典的最小費用流模型,連邊方法寫在**開頭,具體為什麼要這樣連邊本蒟蒻也不易表述清楚,但是在紙上模擬幾組資料發現確實是對的,應該還是很好理解的,實在理解不了的—>戳這兒

注意:區間最好先離散化,最後答案是費用的相反數

/*

for every interval, adde(u,v,1,w);

for i=1~(tot-1), adde(i,i+1,inf,0);

adde(0,1,k,0), adde(tot,tot+1,k,0)

*/#include

#include

#include

#include

#include

#include

using namespace std;

const int maxn=101000;

const int inf=0x3f3f3f3f;

int n,k;

int head[maxn],edge,source,sink;

struct edge e[maxn];

int dis[maxn],pre[maxn];

bool inq[maxn];

int a[maxn],b[maxn],c[maxn],f[maxn<<1],tot;

int mp[maxn];

inline void adde(int u,int v,int r,int c)

inline bool spfa() }}

}return dis[sink]^inf;

}inline int mcmf()

return -ans;

}inline int

read()

while (c>='0'&&c<='9') x=x

*10+c-'0',c=getchar();

return

x*f;

}int main()

sort(f+1,f+(n<<1)+1);

int nn=n<<1;

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

if (f[i]!=f[i-1]) mp[f[i]]=++tot;//discretize intervals

for (int i=1;i1,inf,0);

source=0,sink=tot+1;

adde(source,1,k,0),adde(tot,sink,k,0);

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

adde(mp[a[i]],mp[b[i]],1,-c[i]);

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

}return

0;}

poj 3680 最小費用最大流

思路 因為n 200,而區間範圍為 1,100000 因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。1 include2 include3 include4 include5 include6 using ...

POJ 3680 最小費用最大流

include include include include include include using namespace std const int maxn 500 const int maxm 1e5 10 const int inf 0x3f3f3f3f struct edge edge...

poj 3680 最小費用最大流

思路 因為n 200,而區間範圍為 1,100000 因此需要離散化,去重,然後就是建圖了相連兩點連邊,容量為k,費用為0,然後就是對區間端點進行連邊,容量為1,費用為權值,最後就是跑費用流了。1 include2 include3 include4 include5 include6 using ...