POJ 3281 Питание Максимальный поток + точка разделения

обеденный

Лимит времени:  2000 мс   Лимит памяти:  65536K
Всего Материалы:  26007   Принято:  11411

Описание

Коровы такие привередливые едоки. Каждая корова имеет предпочтение определенных продуктов питания и напитков, и она не будет потреблять не другие.

Фермер Джон приготовил сказочные блюда для своих коров, но он забыл проверить свое меню с их предпочтениями. Несмотря на то, что он не мог бы запихнуть всех, он хочет, чтобы дать полную еду как еду и питье, как много коров, как это возможно.

Фермер Джон приготовил  F  (1 ≤  F  ≤ 100) виды продуктов и подготовлен  D  (1 ≤  D  ≤ 100) типы напитков. Каждый из его  N  (1 ≤  N  ≤ 100) коров решила ли она готова съесть определенную пищу или пить конкретный напиток. Фермер Джон должен назначить тип питания и тип напитка для каждой коровы , чтобы максимизировать количество коров , которые получают оба.

Каждое блюдо или напиток можно употреблять только на одну корову (т.е. когда тип пищи 2 назначается коровы, никакая другая корова не может быть назначена пища типа 2).

вход

Строка 1: Три целых числа:  N F и  D 
Линии 2 .. N + 1: Каждая строка  я  начинается с двух целых чисел  Р я  и  D я , количество блюд , что коровы  я  любит и количество напитков что корова  я  люблю. Следующие  F I  целые числа обозначают посуду , что корова  я  съем, и  D I  целых числа , следующие обозначают напитки , что корова  я  буду пить.

Выход

Строка 1: Одно целое число, максимальное количество коров, которые можно подавать как продукты питания и напитки, которые соответствуют их желаниям

Пример ввода

4 3 3 
2 2 1 2 3 1 
2 2 2 3 1 2 
2 2 3 1 1 2 
2 1 1 3 3

Пример вывода

3

намек

Один из способов удовлетворения трех коров являются: 
Корова 1: нет еды 
Коровы 2: Питание # 2, Пьют # 2 
Корова 3: Питание # 1, Пьет # 1 
Корова 4: Еда # 3, Пьют # 3 
Принцип сукна говорит нам мы не можем сделать ничего лучшего , так как есть только три вида пищи или напитка. Другие наборы тестовых данных являются более сложными, конечно.
 
Значение вопросов: Первая строка входного N, F, D, N выражаются личные, F виды пищи, D видов напитков
Вторая линия, начиная с N строк первых двух чисел представляют число d_num f_num и количество продуктов питания и напитков, а также количество f_num d_num за количество людей готовы выбрать из нескольких представляют определенную пищу и питье
Каждая еда и питье только одна часть, попросил навстречу пожеланиям нескольких людей одновременно
 
 
Решение:
Сетевой поток проблема ключ построить карту, например, источник -> Питание -> Люди -> Напитки -> раковина, но может также обратить внимание на человека , который любит , чтобы получить больше , чем еда и питье, так что карта раскол в источнике  -> Питание -> люди -> люди -> напитки -> т , где люди -> кто тот же человек , к тому же лицу, емкость устанавливается в 1 на нем.
 
Примечание: Этот вопрос относительно небольшое количество данных (воды), где алгоритм Е.К. является переменным током. Хотя hdu4292 Как эта тема и идеи, но с алгоритмом EK не закончен, заблаговременное предупреждение TLE
 
#include <iostream> 
#include <stdio.h> 
#include < Строка .h> 
#include < Строка > 
#include <алгоритм> 
#include <Очередь>
 что используя  пространство имен STD;
 Const  INT MAXN = 500 ;
 Const  INT INF = 0x3FFFFFFF ;
 INT CAP [MAXN] [MAXN]; // сохранить потенциал края, ни одно ребро не инициализируется 0 
ИНТ пути [MAXN] Flow [MAXN];
 ИНТ n-; // число точек, чисел [0, п], включая источник и раковину. 
INT м, FF, D, ST, ENDD; 
Очередь <INT > P; // очереди находится вне времени 262ms, 322ms после внутренней в функцию, но не 
Int BFS () 
{ 
    в то время как (! p.empty ()) 
        p.pop (); 
    MemSet (путь, - 1. , SizeOf (путь)); // каждый раз перед началом поиска маршрута инициализируется -1 
    пути [СТ] = 0 ; 
    течь [СТ] = INF; // исходный узел может иметь бесконечный поток течет в 
    p.push (ул );
     это время ! ( ) p.empty () 
    { 
        INT Теперь = p.front (); 
        p.pop (); 
        IF (теперь == ENDD)
             BREAK ; 
        
        для (INT I = 0 ; I <= п, I ++) // перечислить все точки, пронумерованные отправную точку , если есть изменение может быть здесь изменено 
        {
             IF (ST && путь I = [I] == - 1. && CAP [ Теперь] [I]) 
            { 
                Расход [I] = Расход [теперь] <CAP [теперь] [I]? Поток [теперь]: CAP [теперь] [I]; 
                p.push (I); 
                путь [I] = Теперь; 
            } 
        } 
    } 
    IF (путь [ENDD] == - . 1 ) // т.е. не найден до раковины. Дополняя путь не может найти 
        возврата - 1. ,
     Возврата потока [ENDD]; 
} 
IntEdmonds_Karp () 
{ 
    INT mx_flow = 0 ;
     INT STEP, POS, предварительно,
     это время ((BFS = STEP ()) = - 1. ) // STEP является оставшееся количество 
    { 
        mx_flow + = STEP; 
        POS = ENDD; // из раковины обновить точку трафика на 
        это время (POS =! СТ) 
        { 
            предварительно = путь [POS]; 
            CAP [предварительно] [POS] - = ШАГ; 
            CAP [POS] [предварительно] + = ШАГ; 
            POS = предварительно; 
        } 
    }
    вернуться mx_flow; 
} 
INT основных () 
{ 
    INT еда, питье, f_num, d_num;
    в то время как (~ зсапЕ ( " % d% d% d " , & м, и далее, и г)) 
    { 
        MemSet (колпака, 0 , SizeOf (колпачок)); 
        п = т * 2 + D + ТФ + 1 ; 
        й = 0 ; 
        endd = п;
        для ( INT I = 1 ; я <= т; я ++ ) 
        { 
            зсапЕ ( "% d% d "& f_num, & d_num);
             для ( INT J = 0 ; J <f_num; j ++ ) 
            { 
                зсапЕ ( " % d " , & пища); 
                колпачок [пищи] [я + ТФ] = 1 ; 
            } 

            для ( INT J = 0 ; J <d_num; j ++ ) 
            { 
                зсапЕ ( " % d " , & напиток); 
                крышка [м + ТФ + I] [напиток + 2 * т + и далее] = 1; 
            } 
        } 

        Для ( INT I = 1. , Я <= FF, я ++) // для каждой еды и пить только один 
            CAP [ 0 ] [I] = 1. , 

        Для ( INT I = 1. ; I <= D; I ++ ) 
            CAP [FF + 2 * м + I] [ENDD] = 1. , 

        для ( INT I = 1. , я <= т; я ++ ) 
            CAP [FF + I] [FF + M + I] = 1. ; 

        Е ( " D% \ n- " , Edmonds_Karp ());
    }
    вернуться  0 ; 
}

 

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

отwww.cnblogs.com/-citywall123/p/11335126.html