Смысл проблем
Есть м эксперименты, п-го оборудования, каждый эксперимент сделано будет получить деньги, каждый эксперимент требует некоторого оборудования для завершения, будет тратить деньги на покупку оборудования, оборудование может быть использовано вместе, ища наибольшую выгоду.
п, т <= 50
решение проблемы
Прямой подход записи, и я не хочу его.
Источник подключен к экспериментальной стороне, в результате эксперименты потока денег, оборудование и даже хочет Meeting Point стороны, расходы оборудования потока, даже поэкспериментировать с соответствующей стороной оборудования, поток инфа.
не берут на себя денег, чтобы сделать все эксперименты получили все деньги ANS (не лицо).
Минимальный разрез может найти его снова, ans- минимальный разрез ответ.
Даже край не отрезан эксперимент этот эксперимент, даже отрезать сторону оборудования купить оборудование.
И выходы для вывода схему связи сек. (Я не знаю, почему)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
# include <бит / STDC ++ ч.> с использованием пространства имен STD; Const INT maxn = 105 ; Const INT MAXM = 2705 ; Const ИНТ инф = 1000005 ; INT п, т, с, т, ANS; INT Val [maxn]; BOOL флаг, получить [maxn]; INT CNT = 1 , глава [maxn]; структура края { INT х, у, рядом, Val; } е [MAXM << 1 ]; недействительными добавить ( INT х, ИНТ у, ИНТVal) { е [ ++ CNT] = (край) {х, у, глава [х], Val}; Голова [х] = CNT; } Шаблон < класс Т> инлайн пустот чтения (Т & х) { х = 0 ; символ ч = GetChar (); в то время как ч = (isdigit (ч)!) GetChar (); в то время как (isdigit (ч)) {х = (х << 1 ) + (х << 3 ) + (ч ^ 48 ); ч = GetChar ();} флаг | = (ч == ' \ п ' ); } INT д [maxn]; BOOL BFS () { Очередь }< INT > д; MemSet (д, 0 , SizeOf (г)); q.push (ы), г [с] = 1 ; в то время как (! {q.empty ()) INT х = q.front (); q.pop (); для ( INT I = головы [х]; I; I = е [я] .next) { INT у = е [я] .y; если (! е [я] .val && д [у]) { д [у] = D [X] + 1 ; если (у == т) вернуться верно ; q.push (у); } } Вернуться ложным ; } INT ДФС ( INT х, INT поток) { если (х == т) обратный поток; INT остальное = поток, к; для ( INT I = головы [х]; I; I = е [я] .next) { INT у = е [я] .y; если (е [я] .val && д [у] == д [х] + 1 ) { K = ДФС (у, мин (отдых, е [я] .val)); если (к!) д [у] = 0 ; е [я] .val - = к; е [я ^ 1 ] + = .val к; Остальное - = к; } } вернуть проточного остальное; } INT Динич () { INT разреш = 0 ; в то время как (BFS ()) разреш + = ДФС (с, 0x3f3f3f ); вернуться Рез; } INT основных () { чтение (м); чтение (п); s = 0 ; т = п + т + 1 ; для ( INT I = 1 ; я <= т; я ++ ) { INT х; чтение (х); ANS + = х; Добавить (S, I, х); Добавить (я, с, 0 ); флаг = ложь; в то время как (! флаг) { чтение (х); Добавить (я, х + м, инф); добавить (х + т, I, 0 ); } } Для ( INT I = 1 ; г <= п; я ++ ) { Int х; чтение (х); Добавить (я + т, т, х); Добавить (т, я + т, 0 ); } ANS - = Динич (); для ( INT I = 1 ; я <= т; я ++) если (d [I]) Е ( " % D " , я); putchar (10 ); для ( INT I = т + 1 ; г <= п + т; я ++) если (d [I]) Е ( " % D " , i- м); putchar ( 10 ); Е ( " % d " , ANS); }