Круглый стол проблема (сетевой поток 24 вопроса)

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

Есть п числа единиц, каждая единица есть некоторые люди, есть м таблица, каждая таблица может иметь несколько людей, причем каждая единица не может сидеть за столом, выход программы.

1 <= N <= 150, 1 <= т <= 270.

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

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

Решение затем течет к сети, как две частей блока и таблиц, даже условие потока на стороне может быть обеспечено между узлом источника и количеством блоков, подсоединенных к скорости потока на стороне блока между столом и устройством, между раковиной и столом даже емкость таблицы потока кромки.

(Stupid меня)

Тогда платить волну обычного потока сети Последнее написать сумасшедшую точку T, очевидно, все очень быстро вперед, а затем посмотреть на много дискуссий является последней точкой Т, а некоторые говорят, что ток дуги, чтобы оптимизировать ее.

(Не хочу учиться) пошел посмотреть решение проблемы, увидеть dalao сказать, что эта проблема без демонтажа точки оптимизации дуги, половина ответа, xjb карта здания является чистым (сомнения лица). Взгляд чувствовать себя ничего другое дело, только в ДФС внутри одного, если (отдыхать!) Перерыв;

Плюс прямой результат взлета место.

# include <бит / STDC ++ ч.>
 с использованием  пространства имен STD; 

Const  INT maxn = 506 ;
Const  INT MAXM = 90006 ;
INT п, т, TOT;
INT CNT = 1 , S, T, глава [maxn];
структура края {
   INT х, у, вал, затем; 
} е [MAXM]; 

недействительными добавить ( INT х, INT у, INT вал) { 
  е [ ++ CNT] = (край) {х, у, вал, головка [х]}; 
  Голова [х] = CNT; 
} 

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)); 
      е [я] .val - = к; 
      е [я ^ 1 ] + = .val к; 
      Остальное - = к;
      если (! остальное)перерыв ; 
    } 
  } 
  Вернуть проточного остальное; 
} 

INT Динич () {
   INT разреш = 0 ;
  в то время как (BFS ()) разреш + = ДФС (с, 0x3f3f3f );
  вернуться Рез; 
} 

INT основных () { 
  зсапЕ ( " % d% d " , & п, & м); 
  s = 0 ; т = п + т + 1 ;
  для ( INT I = 1 ; г <= п; я ++ ) {
     INT х; зсапЕ ( " % d " , & х); 
    TOT + =Икс; 
    Добавить (S, I, х); 
    Добавить (я, с, 0 );
    для ( Int J = п + 1 , J <= п + т; j ++ ) { 
      добавление (I, J, 1 ); 
      Добавить (J, I, 0 ); 
    } 
  } 
  Для ( INT I = п + 1 ; г <= п + т; я ++ ) {
     INT х; зсапЕ ( " % d " , & х); 
    добавить (я, т, х); 
    Добавить (T, I, 0 ); 
  } 
  INT ANS = Динич ();
  если (анс! = карапуз) {Е ( " 0 "); возвращать  0 ;} 
  Е ( " 1 \ п " );
  для ( INT I = 1 , г <= п, я ++ ) {
     для ( INT J = глава [я], J, J = е [у] .next)
      , если (е [у] .val!) Е ( " % д " е [J] .y- п); 
    putchar ( 10 ); 
  } 
}
Просмотр кода

 

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

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