# Poj 2516 minimum cost (maximum minimum cost Stream)

Source: Internet
Author: User
Poj 2516 Minimum Cost Link: http://poj.org/problem? Id = 2516

Question:There are m warehouses, N merchants, and K items. Input n, m, K first. Then, enter the number of K in N rows. Each row represents the items to be purchased by a merchant. K numbers represent the number of items to be purchased. Then there is the k Number in m rows. Each row indicates the situation in the warehouse, where k number indicates the inventory of each item. Next, there are K matrices. Each matrix is N * m, indicating the cost for the k-th item to be shipped from M warehouse to the n-th merchant respectively. Ask if it can be reasonably arranged to minimize the cost. If not, output-1.
Ideas:At the beginning, we constructed N * k + M * k points. Later, we found that the maximum minimum cost flow can be performed for each item. Then sum the fee. However, you must first determine whether the conditions can be met. You only need to sum up the demand and supply of each item. If the supply of each item is greater than or equal to the value, you will surely have the answer.
Code:
`/* ID: [email protected] prog: Lang: c ++ */# include <map> # include <set> # include <queue> # include <stack> # include <cmath> # include <cstdio> # include <vector> # include <string> # include <fstream> # include <cstring> # include <ctype. h> # include <iostream> # include <algorithm> using namespace STD; # define Inf (1 <30) # define linf (1ll <60) # define PI ACOs (-1.0) # define MEM (a, B) memset (a, B, sizeof (A) # define rep (I, A, n) for (in T I = A; I <n; I ++) # define per (I, A, n) for (INT I = n-1; I> = A; I --) # define EPS 1e-6 # define debug puts ("================ ") # define Pb push_back # define mkp make_pair # define all (x ). begin (), (x ). end () # define Fi first # define se second # define SZ (x) (INT) (x ). size () # define posin (x, y) (0 <= (x) & (x) <n & 0 <= (y) & (y) <m) typedef long ll; typedef unsigned long ull; const int maxn = 5 555; const int maxm = 500000; struct node {int V, Cap, NXT, cost;} e [maxm * 2]; int G [maxn], CNT, St, Ed, n, m; int ans, flow; int n, m, K; int NK [60] [60], MK [60] [60]; void add (int u, int V, int cap, int cost) {e [++ CNT]. V = V; E [CNT]. CAP = CAP; E [CNT]. cost = cost; E [CNT]. NXT = G [u]; G [u] = CNT; E [++ CNT]. V = u; E [CNT]. CAP = 0; E [CNT]. cost =-cost; E [CNT]. NXT = G [v]; G [v] = CNT;} void Init (int K) {CNT = 1; ans = flow = 0; memset (G, 0, sizeof (INT) * (m + n + 10); // edge ST = 0, ed = m + n + 1, n = Ed; For (INT I = 1; I <= m; I ++) add (St, I, MK [I] [K], 0); For (INT I = 1; I <= N; I ++) add (I + M, Ed, NK [I] [K], 0); int C; For (INT I = 1; I <= N; I ++) {for (Int J = 1; j <= m; j ++) {scanf ("% d", & C); add (J, I + M, INF, c );}}} int dis [maxn], que [maxn], pre [maxn]; bool vis [maxn]; bool spfa () {int font = 0, rear = 1; for (INT I = 0; I <= N; I ++) {dis [I] = inf; vis [I] = false ;} dis [st] = 0; que [0] = sT; vis [st] = true; while (rear! = Font) {int u = que [font ++]; font % = N; vis [u] = false; For (INT I = G [u]; I; I = E [I]. NXT) {int v = E [I]. v; If (E [I]. cap & dis [v]> dis [u] + E [I]. cost) {dis [v] = dis [u] + E [I]. cost; Pre [v] = I; If (! Vis [v]) {vis [v] = true; que [rear ++] = V; Rear % = n ;}}}} if (DIS [ed] = inf) return false; return true;} void augment () {int U, P, MI = inf; For (u = Ed; u! = ST; u = E [P ^ 1]. v) {P = pre [u]; MI = min (MI, E [p]. CAP) ;}for (u = Ed; u! = ST; u = E [P ^ 1]. v) {P = pre [u]; E [p]. cap-= mi; E [P ^ 1]. cap + = mi; ans + = mi * E [p]. cost; // The unit traffic fee recorded by cost must be multiplied by the traffic fee.} Flow + = mi;} int mcmf (int K) {Init (k); While (spfa () Augment (); Return ans;} bool get () {int n_k [110] = {0}, m_k [110] = {0}; int C; rep (I, 1, n + 1) rep (J, 1, k + 1) {scanf ("% d", & C); n_k [J] + = C; NK [I] [J] = C;} rep (I, 1, m + 1) rep (J, 1, k + 1) {scanf ("% d", & C); m_k [J] + = C; MK [I] [J] = C ;}for (INT I = 1; I <= K; I ++) if (n_k [I]> m_k [I]) return false; return true;} int main () {While (~ Scanf ("% d", & N, & M, & K), N | M | K) {If (get ()) {int tot = 0; For (INT I = 1; I <= K; I ++) {tot + = mcmf (I );} printf ("% d \ n", TOT);} else {int C; rep (I, 0, k) rep (J, 0, n) rep (K, 0, m) scanf ("% d", & C); puts ("-1") ;}} return 0 ;}`

Poj 2516 minimum cost (maximum minimum cost Stream)

Related Keywords:

The content source of this page is from Internet, which doesn't represent Alibaba Cloud's opinion; products and services mentioned on that page don't have any relationship with Alibaba Cloud. If the content of the page makes you feel confusing, please write us an email, we will handle the problem within 5 days after receiving your email.

If you find any instances of plagiarism from the community, please send an email to: info-contact@alibabacloud.com and provide relevant evidence. A staff member will contact you within 5 working days.

## A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

• #### Sales Support

1 on 1 presale consultation

• #### After-Sales Support

24/7 Technical Support 6 Free Tickets per Quarter Faster Response

• Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.