bzoj2245 分段加邊典型費用流

2021-07-16 02:34:42 字數 1776 閱讀 7031

你的公司接到了一批訂單。訂單要求你的公司提供n類產品,產品被編號為1~n,其中第i類產品共需要ci

件。公司共有m名員工,員工被編號為1~m員工能夠製造的產品種類有所區別。一件產品必須完整地由一名員工製造,不可以由某名員工製造一部分配件後,再轉交給另外一名員工繼續進行製造。

我們用乙個由0和1組成的m*n的矩陣a來描述每名員工能夠製造哪些產品。矩陣的行和列分別被編號為1~m和1~n,ai,j

為1表示員工i能夠製造產品j,為0表示員工i不能製造產品j。

如 果公司分配了過多工作給一名員工,這名員工會變得不高興。我們用憤怒值來描述某名員工的心情狀態。憤怒值越高,表示這名員工心情越不爽,憤怒值越低,表示 這名員工心情越愉快。員工的憤怒值與他被安排製造的產品數量存在某函式關係,鑑於員工們的承受能力不同,不同員工之間的函式關係也是有所區別的。

對於員工i,他的憤怒值與產品數量之間的函式是乙個si+1段的分段函式。當他製造第1~ti,1

件產品時,每件產品會使他的憤怒值增加wi,1

,當他製造第ti,1+1~ti,2

件產品時,每件產品會使他的憤怒值增加wi,2

……為描述方便,設ti,0=0,ti,si+1=+∞,那麼當他製造第ti,j-1+1~ti,j

件產品時,每件產品會使他的憤怒值增加wi,j

,1≤j≤si+1。

你的任務是制定出乙個產品的分配方案,使得訂單條件被滿足,並且所有員工的憤怒值之和最小。由於我們並不想使用special judge,也為了使選手有更多的時間研究其他兩道題目,你只需要輸出最小的憤怒值之和就可以了。

由於題目中滿足那些分段函式是滿足單調遞增的性質的,所以就可以如下建圖:

s->每個人,費用0,流量inf

每個商品->t,費用0,流量為需要改商品的數量

對於每個人虛擬建n個節點(n<=5)

每個人->虛擬節點,費用為分段函式的值,流量inf

每個人的虛擬節點->那個人能夠做出的商品,費用0,流量inf

竟然要開ll。。。

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

const int n=1005;

const int inf=0x3f3f3f3f;

typedef long long ll;

int n,m,idn[260],idm[260],t[10];

int tot,s,t,head[n],dis[n],pre[n],now[n];

bool b[n];

struct aa

edge[500090];

void addedge(int x,int y,int z,int w)

bool spfa()

} b[u]=false;

} return dis[t]!=inf;

}ll work()

return ans;

}int main()

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

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

t[0]=0;

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

scanf("%d",&x);

addedge(s,idm[i],inf,x);

} printf("%lld",work());

return 0;

}

總結1:這是費用流中分段加邊的典型題(方格取數一樣的),就是兩個點之間有多條邊,費用是不同的這樣型別的題。

2:還是要積累典型題

題目1062 分段函式

題目1062 分段函式 時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 4136 解決 2454 題目描述 編寫程式,計算下列分段函式y f x 的值。y x 2.5 0 x 2 y 2 1.5 x 3 x 3 2 x 4 y x 2 1.5 4 x 6 輸入 乙個浮點數n 輸出 測試資...

HDU 10453 分段函式

分段函式 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 328,accepted users 261 problem 10453 no special judgement pro...

7 2 分段計算居民水費 1 10分

為鼓勵居民節約用水,自來水公司採取按用水量階梯式計價的辦法,居民應交水費y 元 與月用水量x 噸 相關 當x不超過15噸時,y 4x 3 超過後,y 2.5x 10.5。請編寫程式實現水費的計算。輸入格式 輸入在一行中給出非負實數x。輸出格式 按照以下的格式在一行輸出月用水量和應交的水費,都精確到小...