題目:傳送門
題解:超級好題啊大佬們的神題!建圖肥腸靈性!感覺自己是星際玩家。。。
首先呢st直接向每個人連邊,容量為min(k,喜歡的小組個數),費用為0
然後每個人再向ed連,因為題目要求人數盡量多,那麼每個人都至少要去乙個學習小組,那麼容量就為min(k-1,喜歡的小組個數-1),費用為0(表示每個人最多能不選的小組)
每個人還要向自己喜歡的小組連邊,容量為1,費用就為-f[i](因為題目問的是最小的支出,那麼f表示的是手續費,所以肯定為負)
靈性的操作來了:
每個小組當然是還要向ed連的。
直接就把每個小組向ed連n條邊,表示不同人數參加該小組時的花費
容量為1,流量就要推導一下:
對於有i-1個人參加了該小組j,那麼多乙個人的費用差就是:c[j]*i^2-c[j]*(i-1)^2
化簡之後就是:c[j]*(2*i-1);
**:
1 #include2 #include3 #include4 #include5 #include6#define inf 999999999
7using
namespace
std;
8struct
node
9a[510000];int len,last[210
];12
void ins(int x,int y,int c,int
d)13
26int list[210],d[210],la[210
],head,tail,st,ed,n,m,k,ans;
27bool v[210
];28
bool
spfa()
2948}49
}50 head++;if(head==ed+1)head=1
;51 v[x]=false;52
}53if(d[ed]==inf)return
false;54
return
true;55
}56intg_f()
5760 x=ed;while(x!=st)
61 ans+=d[ed]*f;
62return
ans;63}
64int c[110],f[110],tot[110
];65
char s[110
];66
intmain()
6775
for(int i=1;i<=n;i++)ins(st,i,min(k,tot[i]),0),ins(i,ed,min(k-1,tot[i]-1),0
);76
//c[j]*i^2-c[j]*(i-1)^2-->c[j]*(2*i-1)
77for(int j=1;j<=m;j++)for(int i=1;i<=n;i++)ins(j+n,ed,1,c[j]*(2*i-1
));78 ans=0;while(spfa())ans+=g_f();printf("
%d\n
",ans);
79return0;
80 }
BZOJ 3442 學習小組 費用流
題目大意 給出學生的數目和學習小組的數目,學生參加小組需要交納費用,每個小組會支出c i cnt i 2。每個學生可以參加k個小組,問最多的學生參加時,最小支出費用。思路 如果不算後面那個什麼鬼的條件的話,見圖十分顯然。s 每個學生 f k,c 0 每個學生 每個學習小組 f 1,c f i 每個學...
BZOJ3442 學習小組
先不考慮他讓參與人數最多,我們可以s連每個 量k費用0,每個人連能去的小組,流量1費用手續費,小組連t,拆邊建費用 考慮讓參與人數最多,每個人連t流量k 1費用為0,意義是在他參加了社團的情況下他可以把加入社團的機會讓給別的沒有社團的人 include include include include...
BZOJ3442 學習小組
背景 坑校準備鼓勵學生參加學習小組。描述 共有n個學生,m個學習小組,每個學生有一定的喜好,只願意參加其中的一些學習小組,但是校領導為學生考慮,規定乙個學生最多參加k個學習小組。財務處的大叔就沒那麼好了,他想盡量多收錢,因為每個學生參加學習小組都要交一定的手續費,不同的學習小組有不同的手續費。然而,...