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. 问题 B: 傻鸡抓大闸蟹

    问题 B: 傻鸡抓大闸蟹 时间限制: 1 Sec  内存限制: 128 MB提交: 94  解决: 39[提交] [状态] [命题人:jsu_admin] 题目描述 背景又到了吃大闸蟹的季节,黄老师想 ...

  2. JDK_1.8的Windows和Linux环境下的下载与安装

    下载: Eclipse需要Jdk,MyEclipse有自带的Jdk 直接点击下载. Windows下JDK安装: 双击运行程序 下一步: 路径 更改到E:\Software\Java\jre1.8.0 ...

  3. linux安装 rsync 客户端和相关权限认证

    [root@rsync-client-inotify /]# yum install rsync -y [root@rsync-client-inotify /]# echo "redhat ...

  4. python基础--6 集合

    #1.不同元素组成#2.无序#3.集合中的元素必须为不可变类型 a={1,2,3,4,5,(1,2,3)}print(a) #随机向集合添加元素a.add("sjsj")print ...

  5. qt 视频播放

    可以播出视频,待完善 player = new QMediaPlayer(this); playlist = new QMediaPlaylist(); playlist->addMedia(Q ...

  6. Java反编译工具Luyten-0.5.3

    Luyten是一款很强大的反编译工具包,是一款github的开源工具,软件功能非常强大,界面简洁明晰.操作方便快捷,设计得很人性化. 工具软件下载路径:https://github.com/death ...

  7. thinkphp获取目录的方法

    1.获取根目录 http://localhost/ 下面两种方法效果一样 $_SERVER['REQUEST_SCHEME']."://".$_SERVER['HTTP_HOST' ...

  8. vue子传父、父传子

    子传父 vue子传父使用$emit传值 子组件: <template> <div> <button @click="toParent">点击传到 ...

  9. selenium 自动化的坑(3)

    一天一坑系列(3) 今天不讲我是怎么定位了吧,今天讲的是关于弹窗的. 基于业务,一键全否之后需要二次确认,会弹出提示框,你会不会认为这是alert弹框?经过仔细查看元素,确认不是弹框,明明是div嘛, ...

  10. 使用WebAPI流式传输大文件(在IIS上大于2GB)

    这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时候,向后端传入参数:当前为第几块文件,和分片总数 下面直接贴代码吧,一些难懂的我大部分都加上注释了: 上传文件实体类: 看得 ...