bzoj3442 學習小組

2021-07-30 05:39:20 字數 1333 閱讀 4247

題目大意:

共有n個學生,m個學習小組,每個學生只願意參加其中的一些學習小組,但校領導規定乙個學生最多參加k個學習小組。每個學生參加學習小組都要交一定的手續費,不同的學習小組有不同的手續費。然而若有a個學生參加第i個學習小組,那麼就要給這個學習小組組織者獎勵ci*a^2元。在參與學生(而不是每個學習小組的人數總和)盡量多的情況下,求財務處最少要支出多少錢(若為負數,則輸出負數)(支出=總獎勵費-總手續費)。

題解:

最大流

如果忽略參與學生盡量多這個限制的話,我還是會做的qwq

但是還要求參與學生盡量多、、

其實,它翻譯一下就是:如果學生有興趣的話,至少要參加乙個小組,其餘的不做硬性規定。那麼構圖只要對每個學生再加一條i→

t 流量為k-1費用為0的邊就可以了。

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define maxn 210

#define maxm 150010

const

int inf=1e9;

struct node

a[maxm*2];int len,first[maxn];

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

queue

q;bool vis[maxn];

int s,t,pre[maxn],d[maxn],l[maxn],flow[maxn];

int mymin(int x,int y)

vis[s]=true;d[s]=0;flow[s]=inf;q.push(s);

while (!q.empty())

}}vis[x]=false;

}if (pre[t]==-1) return

0; return flow[t];

}int mcmf()

}return ret;

}char s[110];int c[110];

int main()

for (i=1;i<=m;i++) scanf("%d",&c[i]);

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

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

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

return

0;}

BZOJ3442 學習小組

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

BZOJ3442 學習小組

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

bzoj3442 學習小組

time limit 5 sec memory limit 128 mb submit 200 solved 87 submit status discuss 背景 坑校準備鼓舞學生參加學習小組。描寫敘述 共同擁有n個學生,m個學習小組,每乙個學生有一定的喜好,僅僅願意參加當中的一些學習小組,可是校...