网络流24题——分配问题 luogu 4014
题目链接:这里
本题是一个典型的费用流问题,可以作为费用流建图模板使用
首先看到,每个人只能做一件工作,每件工作只能做一次,一个人做某件工作有一定的收益
那么我们建立一个超级源点st和超级终点ed,然后由源点向所有人连边,容量为1,费用为0
接着由工作向汇点连边,容量为1费用为0
上面满足了每个人只做一件工作且每件工作只做一次的要求
最后由人向工作连边,容量为1费用为收益,跑一遍费用流即为最小收益
然后把人向工作连边的边权取负值,再跑一遍费用流,此时最小费用的相反数即为最大收益
这道题向我们提示:最大费用流也是可以跑的,只是将所有费用取反后跑最小费用流即可
#include <cstdio>
#include <cmath>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;
const int INF=0x3f3f3f3f;
struct Edge
{
int next;
int to;
int val;
int pri;
}edge[20005];
int head[255];
int dis[255];
int pre[255];
int fa[255];
int lim[255];
bool used[255];
int a[255][255];
int cnt=1;
int n;
int st,ed;
void init()
{
memset(head,-1,sizeof(head));
memset(edge,0,sizeof(edge));
cnt=1;
}
void add(int l,int r,int w,int v)
{
edge[cnt].next=head[l];
edge[cnt].to=r;
edge[cnt].val=w;
edge[cnt].pri=v;
head[l]=cnt++;
}
int ide(int x)
{
return (x&1)?x+1:x-1;
}
bool spfa()
{
memset(dis,0x3f,sizeof(dis));
memset(lim,0,sizeof(lim));
memset(used,0,sizeof(used));
dis[st]=0;
lim[st]=INF;
pre[ed]=-1;
used[st]=1;
queue <int> M;
M.push(st);
while(!M.empty())
{
int u=M.front();
M.pop();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int to=edge[i].to;
if(edge[i].val&&dis[to]>dis[u]+edge[i].pri)
{
dis[to]=dis[u]+edge[i].pri;
lim[to]=min(lim[u],edge[i].val);
pre[to]=i;
fa[to]=u;
if(!used[to])used[to]=1,M.push(to);
}
}
used[u]=0;
}
return pre[ed]!=-1;
}
int EK()
{
int maxw=0,minv=0;
while(spfa())
{
minv+=dis[ed]*lim[ed];
maxw+=lim[ed];
int temp=ed;
while(temp!=st)
{
edge[pre[temp]].val-=lim[ed];
edge[ide(pre[temp])].val+=lim[ed];
temp=fa[temp];
}
}
return minv;
}
int main()
{
scanf("%d",&n);
init();
for(int i=2;i<=n+1;i++)
{
for(int j=n+2;j<=2*n+1;j++)
{
int x;
scanf("%d",&x);
add(i,j,1,x);
add(j,i,0,-x);
a[i-1][j-n-1]=x;
}
}
st=1,ed=2*n+2;
for(int i=2;i<=n+1;i++)add(st,i,1,0),add(i,st,0,0);
for(int i=n+2;i<=2*n+1;i++)add(i,ed,1,0),add(ed,i,0,0);
printf("%d\n",EK());
init();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
add(i+1,j+n+1,1,-a[i][j]);
add(j+n+1,i+1,0,a[i][j]);
}
}
st=1,ed=2*n+2;
for(int i=2;i<=n+1;i++)add(st,i,1,0),add(i,st,0,0);
for(int i=n+2;i<=2*n+1;i++)add(i,ed,1,0),add(ed,i,0,0);
printf("%d\n",-EK());
return 0;
}
网络流24题——分配问题 luogu 4014的更多相关文章
- 网络流24题 ——运输问题 luogu 4015
题目描述:这里 题面已经提示我们这是费用流了 那么由源点向所有仓库连边,容量为仓库原有货物量,费用为0 然后由所有零售商店向汇点连边,容量为一个零售商店的需求量,费用为0 最后由仓库向零售商店连边,容 ...
- Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...
- Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)
Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...
- Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)
Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...
- Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)
Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...
- Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)
Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...
- Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)
Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...
- Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)
Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...
- 网络流24题——圆桌问题 luogu 3254
题目传送门:这里 这是网络流24题里最简单的一道,我们从这里开始 虽然是网络流24题之一,但可以不用网络流... 本题采用贪心即可 有一个很显然的思想:在分配每一组时,我们都应当优先分配给当前可容纳人 ...
随机推荐
- 比sun.misc.Encoder()/Decoder()的base64更高效的mxBase64算法
package com.mxgraph.online; import java.util.Arrays; /** A very fast and memory efficient class to e ...
- vue2.0里的路由钩子
路由钩子 在某些情况下,当路由跳转前或跳转后.进入.离开某一个路由前.后,需要做某些操作,就可以使用路由钩子来监听路由的变化 全局路由钩子: router.beforeEach((to, from, ...
- sgu438-The_Glorious_Karlutka_River
Description SGU似乎死了... 题目搬到了Codeforces... Problem - 99999438 - Codeforces Solution 动态最大流. 考虑如果不求时间, ...
- element-ui和npm、webpack、vue-cli搭建Vue项目
一.element-ui的简单使用 1.安装 1. npm 安装 推荐使用 npm 的方式安装,它能更好地和 webpack 打包工具配合使用. npm i element-ui -S 2. CDN ...
- Android学习第8天
进程的概念 a) 四大组件都运行在主线程中 b) 服务是没有界面的,可理解为没有界面的Activity c) 进程的优先级 i. ...
- Codeforces Round #513 总结
首次正式的$Codeforces$比赛啊,虽然滚粗了,然而终于有$rating$了…… #A Phone Numbers 签到题,然而我第一次写挂了(因为把11看成8了……) 只需要判断一下有多少个 ...
- Magento 架构基础知识概述
Megento 架构基础知识概述 Magento整合了面向对象的基于PHP的应用程序的核心架构原则.这些一般原则的综合讨论既有在线的,也有印刷形式.以下讨论主要关注这些主题如何直接应用于Magento ...
- css常用单位
css常用单位 本文来简单介绍下css的常用单位. 绝对长度单位 绝对长度单位代表一个物理测量. 像素px(pixels) 在web上,像素px是典型的度量单位,很多其他长度单位直接映射成像素.最终, ...
- python+turtle 笔记
用Python+turtle绘制佩琪: from turtle import * def nose(x,y):#鼻子 penup()#提起笔 goto(x,y)#定位 pendown()#落笔,开始画 ...
- echarts 修改y轴刻度间隔问题
其中min.max可以自定义可以动态获取数据 yAxis : [ { type : 'value', axi ...