Минимальная стоимость [POJ - 2516] [Сеть] Минимальная цена Максимальный расход

Ссылка на тему

Значение вопросов :

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

 

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

отwww.cnblogs.com/WuliWuliiii/p/10945276.html