BZOJ 3442 學習小組 費用流

2021-06-28 08:35:39 字數 1276 閱讀 1821

題目大意:給出學生的數目和學習小組的數目,學生參加小組需要交納費用,每個小組會支出c[i]*cnt[i]^2。每個學生可以參加k個小組,問最多的學生參加時,最小支出費用。

思路:如果不算後面那個什麼鬼的條件的話,見圖十分顯然。

s->每個學生 f:k,c:0

每個學生->每個學習小組 f:1,c:-f[i]

每個學習小組->t f:1,c:1 * c[i],3 * c[i],5 * c[i],7 * c[i],......

後面的條件其實是說,每個學生的k次機會不一定全用光,但是所有人都要參加至少乙個小組。於是我們可以每個人->t f:k - 1,c:0

然後跑費用流

code:

#define _crt_secure_no_deprecate

#include #include #include #include #include #define max 510

#define maxe 200010

#define inf 0x3f3f3f3f

#define s 0

#define t (max - 1)

using namespace std;

struct mincostmaxflow

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

void insert(int x,int y,int f,int c)

bool spfa()

} return f[t] != inf;

} int edmondskarp()

re += f[t] * max_flow;

} return re;

}}solver;

int points,groups,k;

int c[max],f[max];

bool map[max][max];

int main()

if(k - 1)

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

solver.insert(i,t,k - 1,0);

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

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

solver.insert(i + points,t,1,((j << 1) - 1) * c[i]);

cout << solver.edmondskarp() << endl;

return 0;

}

BZOJ3442 學習小組

先不考慮他讓參與人數最多,我們可以s連每個 量k費用0,每個人連能去的小組,流量1費用手續費,小組連t,拆邊建費用 考慮讓參與人數最多,每個人連t流量k 1費用為0,意義是在他參加了社團的情況下他可以把加入社團的機會讓給別的沒有社團的人 include include include include...

BZOJ3442 學習小組

背景 坑校準備鼓勵學生參加學習小組。描述 共有n個學生,m個學習小組,每個學生有一定的喜好,只願意參加其中的一些學習小組,但是校領導為學生考慮,規定乙個學生最多參加k個學習小組。財務處的大叔就沒那麼好了,他想盡量多收錢,因為每個學生參加學習小組都要交一定的手續費,不同的學習小組有不同的手續費。然而,...

bzoj3442 學習小組

題目大意 共有n個學生,m個學習小組,每個學生只願意參加其中的一些學習小組,但校領導規定乙個學生最多參加k個學習小組。每個學生參加學習小組都要交一定的手續費,不同的學習小組有不同的手續費。然而若有a個學生參加第i個學習小組,那麼就要給這個學習小組組織者獎勵ci a 2元。在參與學生 而不是每個學習小...