2193. 分配问题(网络流,费用流,二分图最优匹配)

活动 - AcWing

有 n 件工作要分配给 n 个人做。

第 i 个人做第 j 件工作产生的效益为 cij。

试设计一个将 n 件工作分配给 n 个人做的分配方案。

对于给定的 n 件工作和 n 个人,计算最优分配方案和最差分配方案。

输入格式

第 1 行有 1 个正整数 n,表示有 n 件工作要分配给 n 个人做。

接下来的 n 行中,每行有 n 个整数 cij,表示第 i 个人做第 j 件工作产生的效益为 cij。

输出格式

第一行输出最差分配方案下的最小总效益。

第二行输出最优分配方案下的最大总效益。

数据范围

1≤n≤50
0≤cij≤100

输入样例:
5
2 2 2 1 2
2 3 1 2 4
2 0 1 1 1
2 3 4 3 3
3 2 1 2 1
输出样例:
5
14

解析: 

有 n 个人和 n 件工作,每个人做每个工作都有不同的效率,将 n 个工作分配给 n个人,问我们可以获得的最大效率和最小效率。

我们可以将 n 个人看作左部节点,n 个工作看作右部节点,这就是一个二分图。将每个人做对应工作的效率看作两个节点之间的边的权值,那么其实就是要我们求一个二分图的匹配,使得选中的所有边的权值和最大,这就是一个二分图最优匹配问题。

如果每条边上没有权值,单单是一个二分图最大匹配问题就非常简单,从源点向左部节点连边,右部节点向汇点连边,每个左部节点向每个右部节点连边,所有边的容量都是 1。这样的问题非常直观且常见,因此这里就不再证明原题的方案和流网络的可行流是一一对应的。

可以发现,任意一个可行方案都保证每个员工都能匹配一个工作,意味着任意一个可行方案对应到流网络中都是一个满流,即整数值最大流。

现在再加上每条边上有权值(效率),那么本题就是要我们在所有整数值最大流中找出权值和最大的一个流,就是最大费用最大流。

最大费用最大流只需要在 spfa 算法求最长增广路即可,最长路要求不能有正环,而二分图中不存在正环,因此不会有问题。

另外还要求最小费用最大流,不用再写一遍用 spfa 算法求最短增广路的 EK 算法,可以将所有边的费用取反,这样新图的最大费用最大流再取反回来就是原图的最小费用最大流。

可以先求最小费用最大流,然后将所有边的费用取反去求最大费用最大流。

检验原问题解的集合与可行流的集合一一对应: 

角度一:原问题的每一个解对应一个可行流 

角度二:每一个可行流对应原问题的每一个解 

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
#include<unordered_set>
#include<bitset>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 2500 + 10, M = (2500+100) * 2 + 10, INF = 0x3f3f3f3f;
int n, m, S, T;
int h[N], e[M], f[M], w[M], ne[M], idx;
int q[N], d[N], pre[N], incf[N];
bool st[N];void add(int a, int b, int c, int d) {e[idx] = b, f[idx] = c, w[idx] = d, ne[idx] = h[a], h[a] = idx++;e[idx] = a, f[idx] = 0, w[idx] = -d, ne[idx] = h[b], h[b] = idx++;
}bool spfa() {int hh = 0, tt = 1;memset(d, 0x3f, sizeof d);memset(incf, 0, sizeof incf);q[0] = S, d[S] = 0, incf[S] = 0x3f;while (hh != tt) {int t = q[hh++];if (hh == N)hh = 0;st[t] = 0;for (int i = h[t]; i != -1; i = ne[i]) {int j = e[i];if (f[i] && d[j] > d[t] + w[i]) {d[j] = d[t] + w[i];incf[j] = min(incf[t], f[i]);pre[j] = i;if (!st[j]) {st[j] = 1;q[tt++] = j;if (tt == N)tt = 0;}}}}return incf[T] > 0;
}int EK() {int cost = 0;while (spfa()) {int t = incf[T];cost += t*d[T];for (int i = T; i != S; i = e[pre[i] ^ 1]) {f[pre[i]] -= t, f[pre[i] ^ 1] += t;}}return cost;
}int main() {cin >> n;memset(h, -1, sizeof h);S = 0, T = n * n + 1;for (int i = 1; i <= n; i++) {for (int j = 1,a; j <= n; j++) {scanf("%d", &a);add(i, j + n, 1, a);}}for (int i = 1; i <= n; i++) {add(S, i, 1, 0);add(i + n, T, 1, 0);}printf("%d\n", EK());for (int i = 0; i < idx; i += 2) {f[i] += f[i ^ 1], f[i ^ 1] = 0;w[i] = -w[i], w[i ^ 1] = -w[i ^ 1];}printf("%d\n", -EK());return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/720073.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年计算机视觉技术进展概览

2023年计算机视觉技术进展概览 在2023年&#xff0c;计算机视觉领域出现了多个标志性的进步。以下是十大突破性进展的简要概述&#xff1a; SAM (Segment Anything Model)&#xff1a;由Meta AI开发的SAM成为了分割任务的基础模型&#xff0c;它改革了像素级分类&#xff0c;可…

JavaScript:require 和 import

文章目录 require()起源&#xff1a;语法&#xff1a;使用场景&#xff1a;加载时机&#xff1a;示例 import起源语法使用场景加载时机异步加载示例 require 和 import 是 JavaScript 中用于模块导入的不同语法&#xff0c;它们遵循不同的模块规范 require() 起源&#xff1a;…

MySQL 的备份方式

MySQL 的备份方式 1. 逻辑备份 逻辑备份是指将数据库中的数据导出为可读的 SQL 语句&#xff0c;通过这些语句可以还原数据库的结构和数据。 使用 mysqldump 工具进行逻辑备份 - **命令示例&#xff1a;**mysqldump -u [username] -p [database_name] > backup_file.sql- …

文档书写规范

1.文档名称&#xff1a;时间-发生地-文档内容高度概括 2.内容定性很重要&#xff0c;可以根据现象来阐述问题&#xff0c;少加主管判断容易出错 3.一个大标题就是一页开头 4.每个标题最好统一字数&#xff1a;四字方便记忆&#xff08;专业感&#xff09; 5.设置页数&#…

Spring中的数据校验---JSR303

介绍–什么是JSR303 JSR 303是Java中的一项规范&#xff0c;用于定义在Java应用程序中执行数据校验的元数据模型和API。JSR 303的官方名称是"Bean Validation"&#xff0c;它提供了一种在Java对象级别上执行验证的方式&#xff0c;通常用于确保输入数据的完整性和准…

飞链云共创伙伴亮相温州大学,全国首个AIGC大学俱乐部成立!

在这个充满创新活力的时代&#xff0c;我们见证了一个又一个里程碑式的事件。3月3日&#xff0c;温州大学AIGC俱乐部的成立仪式盛大举行&#xff0c;这标志着全国首个AIGC大学俱乐部的诞生。更让人激动的是&#xff0c;飞链云AI共创伙伴——应流&#xff08;广州&#xff09;科…

PFA晶圆夹在半导体芯片制造中的应用

随着半导体技术的不断进步&#xff0c;晶圆制造作为集成电路产业的核心环节&#xff0c;对生产过程的精密性和洁净度要求日益提高。在众多晶圆制造工具中&#xff0c;PFA&#xff08;全氟烷氧基&#xff09;晶圆夹以其独特的材质和性能&#xff0c;在近年来逐渐受到业界的广泛关…

【Datawhale组队学习:Sora原理与技术实战】AIGC技术基础知识

AIGC是什么 AIGC全称叫做AI generated content&#xff0c;AlGC (Al-Generated Content&#xff0c;人工智能生产内容)&#xff0c;是利用AlI自动生产内容的生产方式。 在传统的内容创作领域中&#xff0c;PGC&#xff08;Professionally-generated Content&#xff0c;专业生…

Qt | 停靠窗口QDockWidget

QDockWidget 是 Qt 框架中的一个窗口小部件,它提供了可停靠的窗口区域,在应用程序主窗口的边缘或浮动在主窗口上层。QDockWidget 继承自 QWidget,并且可以包含其他的窗口小部件作为其内容。 QDockWidget 的主要特点如下: 支持停靠和浮动:QDockWidget 可以停靠在主窗口的…

Untiy 使用AVProVideo插件获取视频的长度

AVPro Video是Unity中一个非常流行的视频插件&#xff0c;可在Unity项目中实现高性能的视频播放功能&#xff0c;功能强大且易用。 如图所示&#xff0c;如果我要获取该视频的长度&#xff0c;方法是很简单的。 1、创建一个测试脚本&#xff1a; using RenderHeads.Media.AVP…

vue3+uniapp在微信小程序实现一个2048小游戏

一、效果展示 二、代码 <template><view class"page"><view class"top"><view class"score">得分:{{total}}</view><view class"time">用时:{{allTime}}s</view></view><view cl…

vue单向数据流介绍

Vue.js 的单向数据流是其核心设计原则之一&#xff0c;也是 Vue 响应式系统的基础。在 Vue.js 中&#xff0c;数据流主要是单向的&#xff0c;从父组件流向子组件。这种设计有助于保持组件之间的清晰通信&#xff0c;减少不必要的复杂性和潜在的错误。 以下是 Vue 单向数据流的…

力扣 单词搜索

判断当前单元格(r,c)的字符与字符串待匹配字符word[idx]是否匹配 如果不匹配&#xff0c;直接回退到上一个单元格与字符 如果匹配&#xff0c;搜索相邻单元格与下一个待匹配字符word[idx1] class Solution { public:int dx[5]{0,0,1,-1};int dy[5]{1,-1,0,0};int flag0;bool d…

Https SSL证书 本地化OCSP地址是什么

OCSP地址即SSL证书中的OCSP验签服务器 最近在做的一个项目上线&#xff0c;前线反馈某些地区访问网站显示白屏&#xff0c;直接影响当地用户使用。公司系统是使用公司自研专用的浏览器登录的&#xff0c;是基于早期谷歌浏览器的开源组件开发的&#xff0c;常出现谷歌访问正常而…

DataWorks(ODPS)性能优化技巧指南

使用阿里云DataWorks进行数据处理的时候&#xff0c;有时候会遇到一个sql或pyodps&#xff08;本质上还是转化为sql&#xff09;执行很长的情况&#xff0c;这个时候有必要对代码进行性能优化。 一、打开ODPS运行评估报告 一个sql脚本执行完毕后&#xff0c;在运维中心的周期…

94. 7张图掌握后端服务重构技巧

文章目录 导言一、逻辑模块重构二、存储模块重构三、逻辑与存储模块联合重构总结 原文地址&#xff1a;7张架构图掌握后端服务重构技巧 导言 随着项目发展&#xff0c;现有模块不再符合需求&#xff0c;重构后端服务必要性拉满。&#x1f468;‍&#x1f4bb; 重构过程中&am…

linux下程序启动即推出的原因定位分析过程

现象&#xff1a; 安装 todesk 的 deb包并配置 daemon 后&#xff0c;todesk无法运行.查看 程序 status 提示&#xff1a;Process: 168846 ExecStart/opt/todesk/bin/ToDesk_Service (codekilled, signalILL) 结论&#xff1a; 引发当前 todesk 启动即退出的原因是当前 CPU指…

873. 最长的斐波那契子序列的长度【leetcode】/动态规划

873. 最长的斐波那契子序列的长度 如果序列 X_1, X_2, …, X_n 满足下列条件&#xff0c;就说它是 斐波那契式 的&#xff1a; n > 3对于所有 i 2 < n&#xff0c;都有 X_i X_{i1} X_{i2} 给定一个严格递增的正整数数组形成序列 arr &#xff0c;找到 arr 中最长的…

大模型通用基础知识解析

大模型的训练和微调 大模型的训练分两个阶段&#xff1a;预训练(Pretrained)和微调(Fine tuning)。因此大模型训练和微调不完全是一个意思&#xff0c;训练包含了微调。 模型预训练&#xff1a;通过在大量无标注数据上进行训练&#xff0c;从而学习到语言的一般规律和知识&am…

代码训练营第52天|● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

文档讲解&#xff1a;代码随想录 (programmercarl.com) 视频讲解&#xff1a;代码随想录的个人空间-代码随想录个人主页-哔哩哔哩视频 (bilibili.com) LeetCode 300.最长递增子序列 题目链接&#xff1a;300. 最长递增子序列 - 力扣&#xff08;LeetCode&#xff09; 解题代码…