每一种货物都是独立的,分成k次最小费用最大流即可!

   1:  /**
   2:  因为e ==0 所以 pe[v]   pe[v]^1 是两条相对应的边
   3:  E[pe[v]].c -= aug;            E[pe[v]^1].c += aug;
   4:  
   5:  */
   6:  #include <queue>
   7:  #include <iostream>
   8:  #include <string.h>
   9:  #include <stdio.h>
  10:  #include <map>
  11:  using namespace std;
  12:  #define V 30010      // vertex
  13:  #define E 150010      // edge
  14:  #define INF 0x3F3F3F3F
  15:  struct MinCostMaxFlow
  16:  {
  17:      struct Edge
  18:      {
  19:          int v, next, cap, cost;  // cap 为容量, cost为单位流量费用
  20:      } edge[E];
  21:   
  22:      int head[V], pe[V], pv[V];            // 每个节点的第一条edge[idx]的编号.
  23:      int  dis[V];            // the shortest path to the src
  24:      bool vis[V];            // visted
  25:      // pe[v]  存放在增广路上到达v的边(u,v) 在edge[]的位置
  26:      // pv[u]  存放在增广路上从u出发的边(u,v) 在edge[]中的位置
  27:      int e, src, sink;            // the index of the edge
  28:      int VertexNum;               // N the num of the vertex. M the num of edges
  29:      void addedge(int  u, int v, int cap, int cost)
  30:      {
  31:          edge[e].v = v, edge[e].cap = cap;
  32:          edge[e].cost = cost,edge[e].next = head[u], head[u] = e++;
  33:          edge[e].v = u, edge[e].cap = 0;
  34:          edge[e].cost = -1*cost, edge[e].next = head[v], head[v] = e++;
  35:      }
  36:      // 求最短路,不存在负环的时候,比 DFS快
  37:      int SPFABFS()
  38:      {
  39:          memset(vis, 0 ,sizeof(vis));
  40:          memset(pv, -1, sizeof(pv));
  41:          for(int i=0; i<V; i++) dis[i] = INF;
  42:          queue<int> Q;
  43:          Q.push(src);
  44:          vis[src] = 1, dis[src] = 0;
  45:          while(!Q.empty())
  46:          {
  47:              int u = Q.front();
  48:              Q.pop();
  49:              vis[u] = 0;
  50:              for(int i=head[u]; i!=-1; i=edge[i].next)
  51:              {
  52:                  int v = edge[i].v;
  53:                  if(edge[i].cap > 0 &&  dis[v] > dis[u] + edge[i].cost  )
  54:                  {
  55:                      dis[v] = dis[u] + edge[i].cost;
  56:                      if(!vis[v])
  57:                      {
  58:                          Q.push(v);
  59:                          vis[v] = 1;
  60:                      }
  61:                      pv[v] = u;
  62:                      pe[v] = i;
  63:                  }
  64:              }
  65:          }
  66:          if(dis[sink] == INF) return -2;          // can't from src to sink.
  67:          return dis[sink];
  68:      }
  69:   
  70:      pair<int,int> MCMF()
  71:      {
  72:          int maxflow = 0, mincost = 0;
  73:          while(SPFABFS())
  74:          {
  75:              if(pv[sink] == -1) break;
  76:              int aug = INF;
  77:              for(int i= sink; i!= src; i = pv[i])
  78:                  aug =min(aug, edge[pe[i]].cap);
  79:              maxflow += aug;
  80:              mincost += aug * dis[sink];
  81:              for(int i = sink; i!= src; i = pv[i])
  82:              {
  83:                  edge[pe[i]].cap -= aug;
  84:                  edge[pe[i]^1].cap += aug;
  85:              }
  86:          }
  87:          return make_pair(maxflow, mincost);
  88:      }
  89:      int solve()
  90:      {
  91:          int N,M,K;
  92:          while(scanf("%d%d%d", &N , &M, &K) && N!=0 && M!=0 && K!=0)
  93:          {
  94:              int tmp;
  95:              vector<int> need[55];
  96:              for(int i=0; i<N; i++)
  97:              {
  98:                  for(int j=0; j<K; j++)
  99:                  {
 100:                      scanf("%d", &tmp);
 101:                      need[i].push_back(tmp);
 102:                  }
 103:              }
 104:              vector<int> supply[55];
 105:              for(int i =0; i<M; i++)
 106:              {
 107:                  for(int j=0; j<K; j++)
 108:                  {
 109:                      scanf("%d", &tmp);
 110:                      supply[i].push_back(tmp);
 111:                  }
 112:              }
 113:              vector<vector<vector<int> > > cost;
 114:              for(int i=0; i<K; i++)
 115:              {
 116:                  vector<vector<int> > y;
 117:                  for(int j=0; j<N; j++)
 118:                  {
 119:                      vector<int> x;
 120:                      for(int k = 0; k<M; k++)
 121:                      {
 122:                          scanf("%d", &tmp);
 123:                          x.push_back(tmp);
 124:                      }
 125:                      y.push_back(x);
 126:                  }
 127:                  cost.push_back(y);
 128:              }
 129:              int ret = 0;
 130:              bool flag = true;
 131:              for(int k = 0; k < K; k++)
 132:              {
 133:                  e=0;
 134:                  memset(head, -1,sizeof(head));
 135:                  // M suppliers
 136:                  src = 0;
 137:                  sink = M+N+1;
 138:                  VertexNum = M+N+2;
 139:                  for(int i=0; i<M; i++)
 140:                  {
 141:                      addedge(src,i+1,supply[i][k],0);
 142:                  }
 143:                  int x = 0;
 144:                  for(int i=0; i<N; i++)
 145:                  {
 146:                      x+= need[i][k];
 147:                      addedge(M+i+1,sink, need[i][k], 0);
 148:                  }
 149:                  for(int j=0; j<M; j++)
 150:                  {
 151:                      for(int i=0; i<N; i++)
 152:                      {
 153:                          addedge(j+1, M+i+1,INF,cost[k][i][j]);
 154:                      }
 155:                  }
 156:                  pair<int,int> res = MCMF();
 157:                  if(res.first < x)
 158:                  {
 159:                      flag = 0;
 160:                      break;
 161:                  }
 162:                  ret += res.second;
 163:              }
 164:              if(flag) cout<<ret<<endl;
 165:              else cout<<-1<<endl;
 166:          }
 167:      }
 168:  } mcmf;
 169:   
 170:   
 171:  int main()
 172:  {
 173:      freopen("1.txt","r",stdin);
 174:      mcmf.solve();
 175:      return 0;
 176:  }

.csharpcode, .csharpcode pre
{
font-size: small;
color: black;
font-family: consolas, "Courier New", courier, monospace;
background-color: #ffffff;
/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt
{
background-color: #f4f4f4;
width: 100%;
margin: 0em;
}
.csharpcode .lnum { color: #606060; }

POJ 2516 最小费用最大流的更多相关文章

  1. poj 3422(最小费用最大流)

    题目链接:http://poj.org/problem?id=3422 思路:求从起点到终点走k次获得的最大值,最小费用最大流的应用:将点权转化为边权,需要拆点,边容量为1,费用为该点的点权,表示该点 ...

  2. POJ - 2195 最小费用最大流

    题意:每个人到每个房子一一对应,费用为曼哈顿距离,求最小的费用 题解:单源点汇点最小费用最大流,每个人和房子对于建边 #include<map> #include<set> # ...

  3. poj 2195 最小费用最大流模板

    /*Source Code Problem: 2195 User: HEU_daoguang Memory: 1172K Time: 94MS Language: G++ Result: Accept ...

  4. POJ 2135 最小费用最大流 入门题

    Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19207   Accepted: 7441 Descri ...

  5. poj 2135最小费用最大流

    最小费用最大流问题是经济学和管理学中的一类典型问题.在一个网络中每段路径都有"容量"和"费用"两个限制的条件下,此类问题的研究试图寻找出:流量从A到B,如何选择 ...

  6. poj 3680(最小费用最大流)

    题目链接:http://poj.org/problem?id=3680 思路:因为N<=200,而区间范围为[1,100000],因此需要离散化,去重,然后就是建图了相连两点连边,容量为k,费用 ...

  7. POJ 2315 最小费用最大流

    从1走到N然后从N走回来的最短路程是多少? 转换为费用流来建模. 1: /** 2: 因为e ==0 所以 pe[v] pe[v]^1 是两条相对应的边 3: E[pe[v]].c -= aug; E ...

  8. POJ 2135 最小费用最大流

    题目链接 Farm Tour Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18961   Accepted: 7326 D ...

  9. POJ 2516 Minimum Cost (最小费用最大流)

    POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...

随机推荐

  1. VMware系统运维(一)安装Esxi

    1.下载ISO文件,开始安装,如图1,直接按回车进行安装. 图1 2.按回车键继续安装,如图2所示 图2 3.选择要安装系统的磁盘,按回车继续,如图3所示 图3 4.选择对应的键盘语言,按回车继续,如 ...

  2. phpnow升级php版本 php-5.2.14-Win32升级至5.3.5

    PHPNow自带的PHP版本为5.2.14,而最后一次更新在于2010-9-22.下面来升级PHP5.3.5: 1.下载安装文件: 先下载PHP5.3.5,下载地址:php-5.3.5-Win32-V ...

  3. HTML5 indexedDB数据库的入门学习(一)

    笔者早些时间看过web sql database,但是不再维护和支持,所以最近初步学习了一下indexedDB数据库,首先indexedDB(简称IDB)和web sql database有很大的差别 ...

  4. 关于VI&VIM的基本使用方法

    本文转载:http://www.cnblogs.com/itech/archive/2009/04/17/1438439.html vi/vim 基本使用方法本文介绍了vi (vim)的基本使用方法, ...

  5. 关于JDK中的集合总结(二)

    1.2版本的JDK才出现的java集合框架. 下面介绍说一下Vector的一些特点. import java.util.Enumeration; import java.util.Iterator; ...

  6. 关于Java获取系统信息

    本文部分转载自: http://www.cnblogs.com/wuhenke/archive/2011/11/19/2255400.html 我总结的相关类似博客:http://www.cnblog ...

  7. 【原】web服务器占有量统计等 web网站

    根据W3Techs的统计,目前世界排名(根据Alexa)前100万的网站中 1. https://w3techs.com/ nginx 中文站 2. http://www.nginx.cn/doc/

  8. stop()方法的精准应用

    stop()方法在动画中扮演了很精彩的角色,他能够阻止连续动画或连续事件出现累积的状况,令动画有条不紊的进行. 1语法结构 stop([clearQueue],[gotoEnd]); 这两个参数都是可 ...

  9. Servlet & JSP - 中文字符问题

    Servlet 中的中文字符 来自 URL 参数部分的中文字符 Tomcat 默认接收数据的编码是 ISO-8859-1.所以当请求 URL 的参数部分含有中文字符,需要转换字符的编码. Enumer ...

  10. SQL Server 查询分析器提供的所有键盘快捷方式(转)

    下表列出 SQL Server 查询分析器提供的所有键盘快捷方式. 活动 快捷方式 书签:清除所有书签. CTRL-SHIFT-F2 书签:插入或删除书签(切换). CTRL+F2 书签:移动到下一个 ...