k种货物分开求解最小费用最大流,主要减少了寻找最短路的时间。

  

#include<queue>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxe 256000 //pay
#define maxv 5120 //pay
#define maxn 55 //pay
#define sc scanf
#define pt printf
#define rep(i,a,b) for(int i=(a);i<(b);++i)
const int inf = 0x3f3f3f3f;
int fee,cg,sp,need;
int N,M,K ,s,t;
typedef struct ed{
int v,nxt,cap,dis;
}ed;
ed e[maxe];
int nxt[maxe],tot,head[maxv],vis[maxv],d[maxv],bk[maxv];
int mp[maxn][maxn][maxn];
int mi(int a,int b) {return a<b?a:b;}
void add(int u,int v,int cap,int dis)
{
e[tot].v=v; e[tot].nxt=head[u];
e[tot].dis=dis; e[tot].cap=cap;
head[u]=tot++; e[tot].v=u; e[tot].nxt=head[v];
e[tot].dis=-dis; e[tot].cap=;
head[v]=tot++;
}
int spfa()
{
queue<int> q;
int u = s,v;
q.push(u);
while(!q.empty())
{
u = q.front(); q.pop();
vis[u] = ;
for(int i = head[u];~i;i=e[i].nxt)
{
if(e[i].cap<) continue;
v = e[i].v;
if(d[u]+e[i].dis<d[v])
{
bk[v]=i;
d[v] = d[u]+e[i].dis;
if(vis[v]==)
{
q.push(v);
vis[v]=;
}
}
}
}
return d[t]!=inf;
} void init()
{
tot=;
memset(head,-,sizeof(head)); //pay
}
int cust_need[maxn][maxn];
int halt_prov[maxn][maxn];
//第一次改进:如果仓库这种东西的存量为0或者客户需求为0,他们之间不建立边 —— 居然RE了
int main()
{
freopen("in.txt","r",stdin);
d[]=; bk[]=-;
while()
{
need = fee = sp = ;
sc("%d%d%d",&N,&M,&K); //pt("%d %d %d\n",N,M,K);
if(N==&&M==&&K==) break;
s=,t=+N+M;
int i,j,k;
memset(mp,-,sizeof(mp));
for(i=;i<N;++i) for(j=;j<=K;++j) sc("%d",&cust_need[i][j]),need+=cust_need[i][j];
for(i=;i<M;++i) for(j=;j<=K;++j) sc("%d",&halt_prov[i][j]);
for(k=;k<=K;++k) for(i=;i<N;++i) for(j=;j<M;++j)
{
sc("%d",&mp[k][i][j]);
if(halt_prov[j][k]==||cust_need[i][k]==) continue;
add(j*K+k,K*M+i*K+k,mi(halt_prov[j][k],cust_need[i][k]),mp[k][i][j]);
}
for(k=;k<=K;++k)
{
init();
for(i=;i<N;++i) if(cust_need[i][k]>) add(+M+i,t,cust_need[i][k],);
for(j=;j<M;++j) if(halt_prov[j][k]>) add(,+j,halt_prov[j][k],);
for(i=;i<N;++i) for(j=;j<M;++j)
{
if(halt_prov[j][k]==||cust_need[i][k]==) continue;
add(+j,+M+i,mi(halt_prov[j][k],cust_need[i][k]),mp[k][i][j]);
}
while()
{
for(i=;i<=t;++i) d[i]=inf,vis[i]=;
if(spfa()==) break;
int min_flow = inf;
cg=bk[t];
while(cg!=-)
{
min_flow = mi(min_flow,e[cg].cap);
cg=bk[e[cg^].v];
}
sp+=min_flow;
cg=bk[t];
while(cg!=-)
{
e[cg].cap-=min_flow;
e[cg^].cap+=min_flow;
fee+=e[cg].dis*min_flow;
cg=bk[e[cg^].v];
}
}
}
if(sp==need) pt("%d\n",fee); // write(fee), pt("\n");
else pt("-1\n");
} return ;
}

POJ 2516

网络流强化-POJ2516的更多相关文章

  1. 网络流强化-HDU2732

    第一次遇到加了“多余”的边会导致WA的——在我看来是很多余,见代码191行 之后会思考为什么,想出来再更. 问题弄明白了,如果你在连接边连了一条到没有柱子的点的边,这个没有柱子的点是不可能连到终点的, ...

  2. 网络流强化-HDU 3338-上下界限制最大流

    题意是: 一种特殊的数独游戏,白色的方格给我们填1-9的数,有些带数字的黑色方格,右上角的数字代表从他开始往右一直到边界或者另外一个黑格子,中间经过的白格子的数字之和要等于这个数字:左下角的也是一样的 ...

  3. 网络流强化-UVA10480

    做这道题,自己先是想了好几种找被割的边的方法——都被否决了. 后来发现是最小割:只要一条边的两端在不同的点集里面就代表是被割掉的满流边(这些满流边的流量和等于最大流的流量与最小割的权值和). 但是之前 ...

  4. 网络流强化-HDU4280

    数组没开够居然显示TLE而不是RE,自己觉得好的优化的方法没什么用…… //http://www.renfei.org/blog/isap.html 带解释的 //https://www.cnblog ...

  5. POJ 2516 Minimum Cost (网络流,最小费用流)

    POJ 2516 Minimum Cost (网络流,最小费用流) Description Dearboy, a goods victualer, now comes to a big problem ...

  6. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  7. [django]数据导出excel升级强化版(很强大!)

    不多说了,原理采用xlwt导出excel文件,所谓的强化版指的是实现在网页上选择一定条件导出对应的数据 之前我的博文出过这类文章,但只是实现导出数据,这次左思右想,再加上网上的搜索,终于找出方法实现条 ...

  8. ITTC数据挖掘平台介绍(七)强化的数据库, 虚拟化,脚本编辑器

    一. 前言 好久没有更新博客了,最近一直在忙着找工作,目前差不多尘埃落定.特别期待而且准备的都很少能成功,反而是没怎么在意的最终反而能拿到,真是神一样的人生. 言归正传,一直以来,数据挖掘系统的数据类 ...

  9. plain framework 1 网络流 缓存数据详解

    网络流是什么?为什么网络流中需要存在缓存数据?为什么PF中要采用缓存网络数据的机制?带着这几个疑问,让我们好好详细的了解一下在网络数据交互中我们容易忽视以及薄弱的一块.该部分为PF现有的网络流模型,但 ...

随机推荐

  1. docker网络 macvlan

    docker 还开发了另一个支持跨主机容器网络的 driver:macvlan. macvlan 本身是 linxu kernel 模块,其功能是允许在同一个物理网卡上配置多个 MAC 地址,即多个 ...

  2. Rest_Framework的视图与路由

    视图与路由 drf除了在数据序列化部分简写代码以外,还在视图中提供了简写操作.所以在django原有的django.views.View类基础上,drf封装了多个子类出来提供给我们使用. Django ...

  3. Oracle DBA_EXTENTS视图 与 DBA_SEGMENTS视图

    DBA_EXTENTS describes the extents comprising the segments in all tablespaces in the database.   Note ...

  4. 搜索---BFS

    搜索   深度优先搜索和广度优先搜索广泛的应用于树和图中,但是他们的应用远不止于此. BFS   广度优先搜索一层一层地进行遍历,每层遍历都是以上一层遍历的结果作为起点,遍历一个距离能访问到的所有节点 ...

  5. JavaScript中准确的判断数据类型

    在 ECMAScript 规范中,共定义了 7 种数据类型,分为基本类型和引用类型两大类. 其中: 基本类型:String.Number.Boolean.Symbol.Undefined.Null  ...

  6. CentOS6.5系统解决中文乱码问题

      一.    问题详情 Windows的默认编码为GBK,Linux的默认编码为UTF-8.在Windows下编辑的中文,在Linux下显示为乱码.为了解决此问题,修改Linux的默认编码为GBK. ...

  7. AD转换为KiCAD的方法

    一.Altium文件转KiCad文件 本文主要介绍: 1.AD文件(SCH和PCB)转换为KiCAD的方法 2.AD封装库转换为KiCAD库的方法 下面让我们进入正题 1.1 PCB的第一种转换方式 ...

  8. python利用循环修改list内容

    写这个主意是记录一下今天遇到的问题,两种循环方式,但是只有一种可以修改list的内容 a=[1,2,3,4,5,6] for i in a: i=7 print(a) 以上这种代码a的内容不变,这里特 ...

  9. Android SDK说明(图)

  10. Linux学习-MySQL的高可用性集群Galera Cluste

    一.Galera Cluste简介 1.Galera Cluster 集成了Galera插件的MySQL集群,是一种新型的,数据不共享的,高度冗余的高可用方案,目前Galera Cluster有两个版 ...