博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2516
阅读量:4317 次
发布时间:2019-06-06

本文共 2999 字,大约阅读时间需要 9 分钟。

/***************************************************************\* Author: Hu Wenbiao* Created Time: Sat 02 Oct 2010 08:31:09 PM CST* File Name: main.cpp* Description: 最小费用最大流。对每种货物用一次mcmf。\***************************************************************///*========================*Head File*========================*\\#include
#include
#include
#include
#include
/*----------------------*Global Variable*----------------------*/#define maxn 105#define inf 0x3f3f3f3fstruct edge { int v, w, f, c, next;} e[5100];int vst[maxn], dis[maxn], start[maxn], p[maxn];int tot, N, M, K, flow_sum, ans, need[60][60], supply[60][60], cost, good_sum;//*=======================*Main Program*=======================*//using namespace std;void _add(int v, int w, int f, int c){ e[tot].v = v; e[tot].w = w; e[tot].f = f; e[tot].c = c; e[tot].next = start[v]; start[v] = tot++;}void add(int v, int w, int f, int c){ _add(v, w, f, c); _add(w, v, 0, -c);}bool spfa(int s, int t, int n){ int v, w; queue < int >q; for (int i = 0; i < n; i++) { p[i] = -1;; vst[i] = 0; dis[i] = inf; } vst[s] = 1; dis[s] = 0; q.push(s); while (!q.empty()) { v = q.front(); q.pop(); vst[v] = false; for (int i = start[v]; i != -1; i = e[i].next) { if (e[i].f) { w = e[i].w; if (dis[w] > dis[v] + e[i].c) { dis[w] = dis[v] + e[i].c; p[w] = i; if (!vst[w]) { vst[w] = true; q.push(w); } } } } } return dis[t] != inf;}int mcmf(int s, int t, int n){ int ans = 0, flow = inf, i; while (spfa(s, t, n)) { for (i = p[t]; i != -1; i = p[e[i].v]) if (e[i].f < flow) flow = e[i].f; for (i = p[t]; i != -1; i = p[e[i].v]) { e[i].f -= flow; e[i ^ 1].f += flow; } ans += dis[t] * flow; flow_sum += flow; } return ans;}int main(){//freopen("input","r",stdin); while (scanf("%d%d%d", &N, &M, &K) == 3 && N && M && K) { ans = 0; for (int i = 1; i <= N; i++) { for (int j = 1; j <= K; j++) { scanf("%d", &need[i][j]); } } for (int i = 1; i <= M; i++) { for (int j = 1; j <= K; j++) { scanf("%d", &supply[i][j]); } } bool flag = true; for (int k = 1; k <= K; k++) { //第k种货物 flow_sum = 0; tot = 0; memset(start, -1, sizeof(start)); for (int i = 1; i <= N; i++) { for (int j = 1; j <= M; j++) { scanf("%d", &cost); if (flag) add(j, M + i, 10000000, cost); } } for (int i = 1; i <= M; i++) { if (flag) add(0, i, supply[i][k], 0); } for (int i = 1; i <= N; i++) { if (flag) add(M + i, M + N + 1, need[i][k], 0); } if (flag) { ans += mcmf(0, N + M + 1, N + M + 2); good_sum = 0; for (int t = 1; t <= N; t++) good_sum += need[t][k]; if (flow_sum < good_sum) //所能达到的最大流小于需要的 flag = false; } } if (flag) printf("%d\n", ans); else printf("-1\n"); }}

转载于:https://www.cnblogs.com/Open_Source/archive/2010/10/03/1904871.html

你可能感兴趣的文章
项目管理实践--VisualSVN Server
查看>>
2595 X之于Y 思维
查看>>
Selenium Webdriver模拟鼠标键盘操作
查看>>
java 导入其他包_java - 如何从默认包导入类
查看>>
嵌入式和java哪个难学_嵌入式和java哪个前景好
查看>>
java即时通讯 开源_im即时通讯开源
查看>>
kettle java交互_通过Java调取Kettle的结果集
查看>>
mysql 导致iis 假死_解决IIS无响应假死状态
查看>>
mysql数据库读取快照隔离_CookBook/1-MySQL数据库读写锁示例详解、事务隔离级别示例详解.md at master · cuiko/CookBook · GitHub...
查看>>
skinme java 路径错误_java 错误 classes路径配置错误
查看>>
python安装tensorflow gpu_[tensorflow] tensorflow-cpu/gpu 安装过程
查看>>
java二维数组矩阵_获取从二维数组矩阵的行和列在Java中
查看>>
matlab综合实验题库,数学实验matlab题库答案
查看>>
oracle wri$_adv_objects突增,SYSTEM Tablespace — oracle-tech
查看>>
python抓取oracle数据,python爬虫,抓取oracle-base上的一些常用脚本
查看>>
oracle分页用子查询,[亲测]Oracle查询--子查询,分页查询(二)
查看>>
oracle动态语句怎么传参数值,DATAX动态参数数据传递
查看>>
php怎么设置文本区域,PHP txt下载不写文本区域内容
查看>>
linux各个目录名称,描述Linux发行版的系统目录名称命名规则以及用途
查看>>
linux 脚本里切换用户密码,shell,切换用户,执行指定,脚本
查看>>