题目链接:这里

本题是一个典型的费用流问题,可以作为费用流建图模板使用

首先看到,每个人只能做一件工作,每件工作只能做一次,一个人做某件工作有一定的收益

那么我们建立一个超级源点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的更多相关文章

  1. 网络流24题 ——运输问题 luogu 4015

    题目描述:这里 题面已经提示我们这是费用流了 那么由源点向所有仓库连边,容量为仓库原有货物量,费用为0 然后由所有零售商店向汇点连边,容量为一个零售商店的需求量,费用为0 最后由仓库向零售商店连边,容 ...

  2. Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

    Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做.第i个人做第j件工作产生的效益为\(c_{ij}\).试设计一个将n件工作分 ...

  3. Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算)

    Libre 6009 「网络流 24 题」软件补丁 / Luogu 2761 软件安装问题 (最短路径,位运算) Description T 公司发现其研制的一个软件中有 n 个错误,随即为该软件发放 ...

  4. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

  5. Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流)

    Libre 6006 「网络流 24 题」试题库 / Luogu 2763 试题库问题 (网络流,最大流) Description 问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同 ...

  6. Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流)

    Libre 6005 「网络流 24 题」最长递增子序列 / Luogu 2766 最长递增子序列问题(网络流,最大流) Description 问题描述: 给定正整数序列x1,...,xn . (1 ...

  7. Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流)

    Luogu 2764 最小路径覆盖问题 / Libre 6002 「网络流 24 题」最小路径覆盖 (网络流,最大流) Description 给定有向图G=(V,E).设P是G的一个简单路(顶点不相 ...

  8. Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流)

    Luogu 2762 太空飞行计划 / Libre 6001 「网络流 24 题」太空飞行计划 (网络流,最大流) Description W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行 ...

  9. 网络流24题——圆桌问题 luogu 3254

    题目传送门:这里 这是网络流24题里最简单的一道,我们从这里开始 虽然是网络流24题之一,但可以不用网络流... 本题采用贪心即可 有一个很显然的思想:在分配每一组时,我们都应当优先分配给当前可容纳人 ...

随机推荐

  1. PHP整洁之道

    摘录自 Robert C. Martin的Clean Code 书中的软件工程师的原则 ,适用于PHP. 这不是风格指南. 这是一个关于开发可读.可复用并且可重构的PHP软件指南. 并不是这里所有的原 ...

  2. Vue项目搭建与部署

    Vue项目搭建与部署 一,介绍与需求 1.1,介绍 Vue  是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上逐层应用.Vue两大核心思想:组件化和数据驱动.组 ...

  3. vue-cli的跨域配置(自己总结)

  4. Vue.Draggable

    Vue.Draggable拖动效果 下载包:npm install vue-draggable --save 组件中引进依赖: import draggable from 'vuedraggable' ...

  5. 【NLP】Conditional Language Models

    Language Model estimates the probs that the sequences of words can be a sentence said by a human. Tr ...

  6. JS判断浏览器是否支持触屏事件

    var hasTouch=function(){ var touchObj={}; touchObj.isSupportTouch = "ontouchend" in docume ...

  7. supervisor进程管理的使用

    介绍 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启.它是通过fork/exec的方式把这些被管理 ...

  8. 【XSY2887】【GDOI2018】小学生图论题 分治FFT 多项式exp

    题目描述 在一个 \(n\) 个点的有向图中,编号从 \(1\) 到 \(n\),任意两个点之间都有且仅有一条有向边.现在已知一些单向的简单路径(路径上任意两点各不相同),例如 \(2\to 4\to ...

  9. 2.7 json 模块

  10. radio,check美化

    单选框与复选框原生控件美化有多种解决方案,现在采用经典的input+label的方式自己实现一种 思路: input 和label 通过id和for属性关联,点击label时,input选中状态改变 ...