обеденный
Лимит времени: 2000 мс | Лимит памяти: 65536K | |
Всего Материалы: 26007 | Принято: 11411 |
Описание
Коровы такие привередливые едоки. Каждая корова имеет предпочтение определенных продуктов питания и напитков, и она не будет потреблять не другие.
Фермер Джон приготовил сказочные блюда для своих коров, но он забыл проверить свое меню с их предпочтениями. Несмотря на то, что он не мог бы запихнуть всех, он хочет, чтобы дать полную еду как еду и питье, как много коров, как это возможно.
Фермер Джон приготовил F (1 ≤ F ≤ 100) виды продуктов и подготовлен D (1 ≤ D ≤ 100) типы напитков. Каждый из его N (1 ≤ N ≤ 100) коров решила ли она готова съесть определенную пищу или пить конкретный напиток. Фермер Джон должен назначить тип питания и тип напитка для каждой коровы , чтобы максимизировать количество коров , которые получают оба.
Каждое блюдо или напиток можно употреблять только на одну корову (т.е. когда тип пищи 2 назначается коровы, никакая другая корова не может быть назначена пища типа 2).
вход
Линии 2 .. N + 1: Каждая строка я начинается с двух целых чисел Р я и D я , количество блюд , что коровы я любит и количество напитков что корова я люблю. Следующие F I целые числа обозначают посуду , что корова я съем, и D I целых числа , следующие обозначают напитки , что корова я буду пить.
Выход
Пример ввода
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
Принцип сукна говорит нам мы не можем сделать ничего лучшего , так как есть только три вида пищи или напитка. Другие наборы тестовых данных являются более сложными, конечно.
#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 ; }