вопросы программы космического полета (сеть поток 24 вопросов)

Смысл проблем

Есть м эксперименты, п-го оборудования, каждый эксперимент сделано будет получить деньги, каждый эксперимент требует некоторого оборудования для завершения, будет тратить деньги на покупку оборудования, оборудование может быть использовано вместе, ища наибольшую выгоду.

п, т <= 50

решение проблемы

Прямой подход записи, и я не хочу его.

Источник подключен к экспериментальной стороне, в результате эксперименты потока денег, оборудование и даже хочет Meeting Point стороны, расходы оборудования потока, даже поэкспериментировать с соответствующей стороной оборудования, поток инфа.

не берут на себя денег, чтобы сделать все эксперименты получили все деньги ANS (не лицо).

Минимальный разрез может найти его снова, ans- минимальный разрез ответ.

Даже край не отрезан эксперимент этот эксперимент, даже отрезать сторону оборудования купить оборудование.

И выходы для вывода схему связи сек. (Я не знаю, почему)

# 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); 
}
Просмотр кода

 

рекомендация

отwww.cnblogs.com/sto324/p/11334074.html
-24