POJ2516 Minimum Cost【最小费用最大流】
题意:
有N个客户,M个仓库,和K种货物。已知每个客户需要每种货物的数量,每个仓库存储每种货物的数量,每个仓库运输各种货物去各个客户的单位费用。判断所有的仓库能否满足所有客户的需求,如果可以,求出最少的运输总费用。
思路:
最小费用最大流。先判断是否每种货物的存储总量都足够,足够的话,对每一种货物进行一次最小费用最大流求出完成这种货物运输的最小总费用,所有的总费用相加就是结果了。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring> using namespace std;
const int maxn = ;
const int inf = ; int n, ans;
int cap[maxn][maxn], pre[maxn];
int cost[maxn][maxn], dis[maxn];
int que[maxn];
bool vis[maxn]; bool spfa()
{
int i, head = , tail = ;
for(i = ; i <= n; i ++){
dis[i] = inf;
vis[i] = false;
}
dis[] = ;
que[] = ;
while(tail != head){
int u = que[head];
vis[u] = true;
for(i = ; i <= n; i ++)
if(cap[u][i] && dis[i] > dis[u] + cost[u][i]){
dis[i] = dis[u] + cost[u][i];
pre[i] = u;
if(!vis[i]){
vis[i] = true;
que[tail ++] = i;
if(tail == maxn) tail = ;
}
}
vis[u] = false;
head ++;
if(head == maxn) head = ;
}
if(dis[n] == inf) return false;
return true;
} void end()
{
int i, sum = inf;
for(i = n; i != ; i = pre[i])
sum = min(sum, cap[pre[i]][i]);
for(i = n; i != ; i = pre[i]){
cap[pre[i]][i] -= sum;
cap[i][pre[i]] += sum;
ans += cost[pre[i]][i] * sum;
}
} int main()
{
int N, M, K, i, j, k;
int need[maxn][maxn], NeedK[maxn];
int have[maxn][maxn], HaveK[maxn];
while(cin>>N>>M>>K,N,M,K)
{
memset(NeedK, , sizeof(NeedK));
for(i = ; i <= N; i ++)
for(j = ; j <= K; j ++){
scanf("%d", &need[i][j]); // 第i个客户需要第j种货物的量。
NeedK[j] += need[i][j]; // 第j种货物总共需要的量。
}
memset(HaveK, , sizeof(HaveK));
for(i = ; i <= M; i ++)
for(j = ; j <= K; j ++){
scanf("%d", &have[i][j]); // 第i个仓库存储第j种货物的量。
HaveK[j] += have[i][j]; // 第j种货物总共需要的量。
}
bool flag = true;
for(i = ; i <= K; i ++) // 判断所有货物是否足够。
if(NeedK[i] > HaveK[i]){
flag = false; break;
}
ans = ;
n = N + M + ;
for(k = ; k <= K; k ++){
memset(cap, , sizeof(cap));
for(i = ; i <= N; i ++) // 建图。
for(j = ; j <= M; j ++){
scanf("%d", &cost[j][M+i]);
cost[M+i][j] = -cost[j][M+i];
cap[j][M+i] = inf;
}
if(!flag) continue;
for(i = ; i <= M; i ++){
cap[][i] = have[i][k];
cost[][i] = cost[i][] = ;
}
for(i = ; i <= N; i ++){
cap[M+i][n] = need[i][k];
cost[M+i][n] = cost[n][M+i] = ;
}
while(spfa()) end(); // 最小费用最大流算法。
}
if(flag) cout << ans << endl;
else cout << - << endl;
}
return ;
}
POJ2516 Minimum Cost【最小费用最大流】的更多相关文章
- POJ2516 Minimum Cost —— 最小费用最大流
题目链接:https://vjudge.net/problem/POJ-2516 Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Tota ...
- POJ2516:Minimum Cost(最小费用最大流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19088 Accepted: 6740 题目链 ...
- Minimum Cost(最小费用最大流)
Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his s ...
- POJ 2516 Minimum Cost [最小费用最大流]
题意略: 思路: 这题比较坑的地方是把每种货物单独建图分开算就ok了. #include<stdio.h> #include<queue> #define MAXN 500 # ...
- Poj 2516 Minimum Cost (最小花费最大流)
题目链接: Poj 2516 Minimum Cost 题目描述: 有n个商店,m个仓储,每个商店和仓库都有k种货物.嘛!现在n个商店要开始向m个仓库发出订单了,订单信息为当前商店对每种货物的需求 ...
- POJ2516 Minimum Cost(最小费用最大流)
一开始我把每个店主都拆成k个点,然后建图..然后TLE.. 看题解= =哦,愚钝了,k个商品是独立的,可以分别跑k次最小费用最大流,结果就是k次总和.. #include<cstdio> ...
- POJ 2516 Minimum Cost (最小费用最大流)
POJ 2516 Minimum Cost 链接:http://poj.org/problem?id=2516 题意:有M个仓库.N个商人.K种物品.先输入N,M.K.然后输入N行K个数,每一行代表一 ...
- poj-2516.minimum cost(k次费用流)
Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19883 Accepted: 7055 Des ...
- POJ - 2516 Minimum Cost(最小费用最大流)
1.K种物品,M个供应商,N个收购商.每种物品从一个供应商运送到一个收购商有一个单位运费.每个收购商都需要K种物品中的若干.求满足所有收购商需求的前提下的最小运费. 2.K种物品拆开来,分别对每种物品 ...
随机推荐
- JavaScript——变量
本文简述了JavaScript变量的数据类型,以及变量类型检测与类型转换 一.介绍 JavaScript的变量有6种数据类型,包含5种原始类型和1种对象类型.本人比较喜欢用逻辑图的形式总结知识点,这样 ...
- 自学Linux Shell11.3-使用变量
点击返回 自学Linux命令行与Shell脚本之路 11.3-使用变量 Shell脚本的执行通常可以采用以下几种方式: 1):bash script-name或sh script-name(推荐使用) ...
- 自学Zabbix2.5-客户端agentd安装过程
点击返回:自学Zabbix之路 ....
- BZOJ 4671 异或图 | 线性基 容斥 DFS
题面 Description 定义两个结点数相同的图 G1 与图 G2 的异或为一个新的图 G, 其中如果 (u, v) 在 G1 与 G2 中的出现次数之和为 1, 那么边 (u, v) 在 G 中 ...
- 对 spi 的认知
在使用 SPI 外设场景下,只需将数据送至 SPI->DR,外设将数据自动发走 在使用 DMA 外设场景下,只需指定数据缓存区地址及 SPI->DR 地址,这样就无需劳驾 CPU 而开始数 ...
- PMOS 与 NMOS
PMOS: NMOS: NMOS是栅极高电平(VGS > Vt)导通,低电平断开,可用来控制与地之间的导通.PMOS是栅极低电平(VGS < Vt)导通,高电平断开,可用来控制与电源之间的 ...
- Raspbian开启root账户
启用root账户 使用默认用户pi,密码raspberry登录树莓派 sudo passwd root #给root账户设置密码 sudo passws --unlock root #解除root账户 ...
- 应用程序发生异常 unknown software exception (0xc00000fd)... - 栈溢出(Stack overflow)
今天在写程序的时候,弹出这样的提示对话框: 应用程序发生异常 unknown software exception (0xc00000fd): 相关代码是这样,在一个函数中读取一个csv文件,先根据这 ...
- 关于阿里云Centos服务器搭建Java网站不能访问的问题
首先阿里云提供的手册是没问题的 手工搭建 然后我在地址栏输入服务器地址之后总是提示无法访问! 输入命令 netstat -tunlp,80端口确实是在监听(这里不是8080,因为我在tomcat的配置 ...
- (原)2018牛课多校第4场--G
传送门 /* 按值从大到小排序,记录下相应出现的次数并去重 枚举:从大到小枚举,如果能够通过删除其他数让当前这个数成为众数,则循环结束,输出此数,如果循环结束也没答案,输出-1 优先级:值优先 举例: ...