Значение вопросов :
Есть N количество предприятий, которые они должны источника товаров, поставщиков товаров, а также видов M, N K предприятий, которые нуждаются элементов, каждый элемент имеет соответствующий спрос, то предприятия M являются соответствующие описи каждого элемента, а затем матрица K N * M представляет собой цену к статье транспорта от поставщиков бизнес-единиц, это стандартный максимальный поток минимальной стоимости, нам нужно только создать такую сторону, для всех поставщиков и источников указать, чтобы установить размер потока есть число принадлежит стороне, и предприниматели установить инфинити и по бокам цены единицы товара является ценой потока, а затем, начиная с бизнесом бокового потока, чтобы достичь места встречи, чтобы установить размер своих потребностей, и пункт встречи стоимость создания стороны источника является 0.
Идеи :
В начале, я планирую запустить прямой поток затрат, но после этого пробега, найду Т, то существует N с учета потребностей бизнеса, а также поставщик M, если вы хотите, чтобы направить снова, чтобы закончить его, точку это число (N + M + N * K + M * K) число точек, как это слишком много, но мы можем изменить, если разделить на время K для обсуждения, не представляется возможным оптимизировать вниз сложность времени.
Таким образом, мы разделили на время K, каждый процесс, соответствующий типу товаров и стоимость строительства стороны были запущены потоки, следующим образом.
#include <iostream> #include <cstdio> #include <CMATH> #include < строка > #include <CString> #include <алгоритм> #include <пределы> #include <вектор> #include <стек> #include <очереди> # include < установлен > #include <карта> #define lowbit (х) (х & (- х)) #define пи 3,141592653589793 #define е 2,718281828459045 #define INF 0x3f3f3f3f #define HALF (L + R) >> 1 #defineLSN RT << 1 #define РСН RT << 1 | 1 #define Lson LSN, л, средний #define Rson РСН, середина + 1, г #define QL Lson, Ql, Qr #define QR - Rson, QL, Qr #define сам к.т., L, R , используя пространства имен зЬй; Const INT maxN = 107 , S = 0 ; INT N, M, K, T, потребность [ 55 ], есть [ 55 ], магазин [ 55 ] [ 55 ], хорошо [ 55 ] [ 55 ], г [maxN] [maxN], с [maxN] [maxN] ; INT предварительно [maxN], расстояние [maxN], поток [maxN], ANS; очереди < INT >Q; BOOL inque [maxN]; BOOL SPFA () { MemSet (до, 0 , SizeOf (предварительно)); MemSet (расстояние, INF, SizeOf (расстояние)); MemSet (inque, ложная , SizeOf (inque)); Q.push (S); inque [S] = верно ; расстояние [S] = 0 ; Поток [S] = INF; в то время как (! Q.empty ()) { INT и = Q.front (); inque [и] = ложь ; Q.pop (); для ( INT I = 0 ; я <= Т; я ++ ) { если (Г [и] [I] && расстояние [I]> расстояние [и] + с [и] [I]) { расстояние [I] = расстояние [и] + с [и] [I]; Поток [I] = мин (расход [и], г [и] [I]); предварительно [I] = U; если (! inque [я]) { inque [я] = истинный ; Q.push (я); } } } } Возвращают предварительно [T]; } INT Е.К. () { INT ANS = 0; в то время как (SPFA ()) { INT Теперь = Т, Лас = предварительно [теперь]; в то время как (теперь) { г [LAS] [теперь] - = Расход [T]; г [теперь] [Лас] + = Расход [Т]; Теперь = лас; лас = предварительно [теперь]; } ANS + = Расход [Т] * расстояние [T]; } Возврата ANS; } Инлайн недействительными инициализации () { ANS = 0 ; Т = N + М + 1 ; MemSet (потребность, 0 , SizeOf (потребность)); MemSet (есть, 0 , SizeOf (есть)); } INT основных () { в то время как (Scanf ( " % d% d% D " , & N, & M, K &) && (Н || М || K)) { INIT (); для ( INT I = 1 ; г <= N; я ++ ) { для ( Int J = 1 , J <= K; j ++ ) { зсапЕ ( " % d " , & магазин [I] [J]); нужен [J] + = магазин [I] [J ]; } } Для ( INT I = 1 ; я <= М; я ++ ) { для ( INT J = 1 , J <= K; j ++ ) { зсапЕ ( " % d " , & хорошо [I] [J]); есть [J] + = хорошо [I] [J]; } } BOOL флаг = верно ; для ( INT I = 1 ; г <= K; я ++ ) { если есть [я])(потребность [I]> { Флаг = ложь ; перерыв ; } } Для ( INT I = 1 ; г <= K; я ++ ) { MemSet (г, 0 , SizeOf (г)); MemSet (с, 0 , SizeOf (с)); для ( INT J = 1 , J <= N; j ++ ) { г [S] , [J] = магазин [J] [I]; для ( INT кк = 1 ; кк <= М; кк ++ ) { зсапЕ ( " % d " , & с [J] [N + кк]); с [Н + кк] [J] = -c [J] [N + кк]; г [J] [Н + кк] = INF; } } Если (флаг!) По- прежнему ; для ( INT J = 1 , J <= М; j ++) г [N + J] [Т] = хорошо [J] , [I]; ANS + = EK (); } Если (! Флаг) {Е ( " -1 \ п "); продолжить ; } Е ( " % d \ п " , ANS); } Возвращает 0 ; }