当前位置: 首页 > news >正文

P4015 运输问题

P4015 运输问题

大意

在保证所有货物运出的前提下,分别寻找总开销最省和最贵的路径方案。

思路

首先来说,我们对于这些货物和商店来说,最终要保证最大流,就是 \(in = out\),那么我们考虑一个事情,就是我们的货物如何运,运到哪里,运多少,我们是不关心的,那么中间我们就可以把每个货物和商店连上容量为正无穷的边,也就是对网络流说:“你爱怎么选怎么选,只要跑出来使得我花费最小即可”。

但是我们需要考虑货物的量和商店需要的量,这个东西我们其实可以在 \(S\)\(T\) 的部分就将其设定住,这样就能保证最终所有货物都有所归(方案很多,一定能保证流最大,且为 \(\sum a_i\)),那么我们就建出图,跑两次费用流即可。

代码

#include<bits/stdc++.h>
using namespace std;const int MAXN = 5005;
const int MAXM = 40005;
struct node{int u, v, nxt, c, w;
}e[MAXM * 4];int S, T;
int tot, h[MAXN], d[MAXN], pre[MAXN];
bool vis[MAXN];
void init(){tot = 0;memset(h, -1, sizeof(h));
}void add(int u, int v, int c, int w){e[tot] = {u, v, h[u], c, w};h[u] = tot ++;e[tot] = {v, u, h[v], 0, -w};h[v] = tot ++;
}bool spfa(){memset(vis, 0, sizeof(vis));memset(d, 0x3f, sizeof(d));memset(pre, -1, sizeof(pre));queue<int> q;q.push(S);d[S] = 0;vis[S] = true;while(!q.empty()){int u = q.front();q.pop();vis[u] = false;for(int i = h[u];~i;i = e[i].nxt){int v = e[i].v;if(e[i].c){if(d[v] > d[u] + e[i].w){d[v] = d[u] + e[i].w;pre[v] = i;if(!vis[v]){q.push(v);vis[v] = true;}}}}}return (pre[T] != -1);
}int EK(){int res = 0;while(spfa()){int Min = 1e9;for(int i = T;i != S;i = e[pre[i]].u){Min = min(Min, e[pre[i]].c);}for(int i = T;i != S;i = e[pre[i]].u){e[pre[i]].c -= Min;e[pre[i] ^ 1].c += Min;res += e[pre[i]].w * Min;}}return res;
}int n, m;
int a[MAXN], b[MAXN], H[105][105];int main(){// freopen("dolls.in", "r", stdin);// freopen("dolls.out", "w", stdout);cin >> m >> n;S = 0, T = n + m + 1;for(int i = 1;i <= m;i ++) cin >> a[i];for(int j = 1;j <= n;j ++) cin >> b[j];for(int i = 1;i <= m;i ++){for(int j = 1;j <= n;j ++){cin >> H[i][j];}}init();for(int i = 1;i <= m;i ++) add(S, i, a[i], 0);for(int j = 1;j <= n;j ++) add(j + m, T, b[j], 0);for(int i = 1;i <= m;i ++){for(int j = 1;j <= n;j ++){add(i, j + m, 1e9, H[i][j]);}}cout << EK() << endl;init();for(int i = 1;i <= m;i ++) add(S, i, a[i], 0);for(int j = 1;j <= n;j ++) add(j + m, T, b[j], 0);for(int i = 1;i <= m;i ++){for(int j = 1;j <= n;j ++){add(i, j + m, 1e9, -H[i][j]);}}cout << -EK() << endl;return 0;
}
http://www.jsqmd.com/news/379518/

相关文章:

  • Java毕设项目推荐-springboot基于WIFI协议的大学课堂点名系统的设计与实现 基于Spring Boot的智能点名管理系统【附源码+文档,调试定制服务】
  • Java毕设项目推荐-基于SpringBoot+Vue的求职招聘平台设计与实现基于SpringBoot的招聘求职平台的设计与实现【附源码+文档,调试定制服务】
  • 2026-02-13学习
  • 春节期间杂题练习
  • 装修 绿植 中古风
  • 特价股票与公司研发投入效率的关系分析
  • MySQL慢查询分析与索引优化实战技巧
  • AI元人文:实践与他者
  • CDP 常用数据类型与 MySQL 数据类型对应关系
  • Java毕设项目推荐-基于SpringBoot技术的流浪动物管理系统的设计与实现宠物信息、领养、寄养、审核【附源码+文档,调试定制服务】
  • Java毕设项目推荐-基于Web的文物知识普及系统设计与实现【附源码+文档,调试定制服务】
  • Flink Kerberos 安全接入整体机制、三大安全模块、Standalone/K8s/YARN 部署与 Token 续期策略
  • Flink Delegation Tokens(DT)彻底讲透为什么需要、生命周期、续期机制与生产踩坑清单
  • Flink SSL/TLS 安全加固内网 mTLS、REST HTTPS、证书 Pinning 与部署要点
  • P2045 方格取数加强版
  • 学习记录260213
  • OpenCSG(开放传神)赋能科研机构:广东省智能院的AI一体化研发基座
  • AI计算平台前沿进展:下一代AI计算平台——“OpenEmbodied AI Platform (OEAP)设计框架(2)
  • TDengine IDMP 数据可视化 6. 资产列表
  • Java计算机毕设之springboot基于WIFI协议的课堂点名系统的设计与实现基于java+springboot+vue的课堂点名系统(完整前后端代码+说明文档+LW,调试定制等)
  • Java计算机毕设之基于SpringBoot的校园一卡通系统的设计与实现基于web的高校一卡通管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)
  • 通胀保值投资:实物资产在投资组合中的角色
  • P2740 [USACO4.2] 草地排水 Drainage Ditches
  • 异步编程中的共享变量与竞态条件
  • 2026广东最新紫晶洞厂家top5推荐!广州等地优质天然水晶源头供应商权威榜单,品类全货源稳,助力客商高效采购 - 品牌推荐2026
  • 2026广东最新巴西紫水晶洞生产厂家top5推荐!广州等地优质巴西紫水晶洞供应商权威榜单发布,货源品质双优助力批发采购 - 品牌推荐2026
  • 【毕业设计】springboot基于WIFI协议的课堂点名系统的设计与实现(源码+文档+远程调试,全bao定制等)
  • P6577 【模板】二分图最大权完美匹配
  • 详细介绍:Maven 编译的settings配置和pom、idea配置关系
  • 【毕业设计】基于SpringBoot生活版青年学习平台(源码+文档+远程调试,全bao定制等)