P1791-[国家集训队]人员雇佣【最大权闭合图】
正题
题目链接:https://www.luogu.com.cn/problem/P1791
题目大意
有\(n\)个人,雇佣第\(i\)个需要\(A_i\)的费用,对于\(E_{i,j}\)表示如果\(i\)选了的话,选择\(j\)会获得\(E_{i,j}\)的费用,不选\(j\)会花费\(E_{i,j}\)的费用。
\(1\leq n\leq 1000\)
解题思路
考虑网最大权值闭合图,先加上所有可以获得的权值,然后考虑需要失去的最小权值。
因为每个人可以选或者不选,那么就可以让\(s\)连接\(i\)且\(i\)连接\(t\)这样两边必须割掉一条表示选择或者不选择。
考虑让\(s->i\)表示选择,那么\(s->i\)权值为\(A_i\)。
\(i->t\)表示不选择那么所有由\(i\)产生的费用都不能获得,权值为\(\sum_{j=1}^mE_{i,j}\)。
然后对于一个\(E_{i,j}\)如果\(i\)选择了且\(j\)没有选择那么就会失去\(2\times E_{i,j}\)的流量,在\(i\)和\(j\)之间连一条\(2\times E_{i,j}\)的就好了。
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
const ll N=2e4+10,inf=2147483647;
struct node{
ll to,next,w;
}a[N*4];
ll n,s,t,tot,cnt,A[N],ls[N],dep[N],ans;
queue<int> q;
void addl(ll x,ll y,ll w){
a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;
a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
return;
}
bool bfs(){
memset(dep,0,sizeof(dep));dep[s]=1;
while(!q.empty())q.pop();q.push(s);
while(!q.empty()){
ll x=q.front();q.pop();
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(dep[y]||!a[i].w)continue;
dep[y]=dep[x]+1;
if(y==t)return 1;
q.push(y);
}
}
return 0;
}
ll dinic(ll x,ll flow){
if(x==t)return flow;
ll rest=0,k;
for(ll i=ls[x];i;i=a[i].next){
ll y=a[i].to;
if(dep[y]!=dep[x]+1||!a[i].w)continue;
rest+=(k=dinic(y,min(a[i].w,flow-rest)));
a[i].w-=k;a[i^1].w+=k;
if(rest==flow)return flow;
}
if(!rest)dep[x]=0;
return rest;
}
signed main()
{
scanf("%lld",&n);
s=n+1;t=s+1;tot=1;
for(ll i=1;i<=n;i++){
ll x;
scanf("%lld",&x);
addl(s,i,x);
}
for(ll i=1;i<=n;i++){
ll S=0;
for(ll j=1;j<=n;j++){
ll x;scanf("%lld",&x);
if(!x)continue;
S+=x;addl(i,j,2*x);
}
addl(i,t,S);ans+=S;
}
while(bfs())
ans-=dinic(s,inf);
printf("%lld\n",ans);
return 0;
}
P1791-[国家集训队]人员雇佣【最大权闭合图】的更多相关文章
- luoguP1791 [国家集训队]人员雇佣
题意 考虑先将所有价值加上,之后用最小割求最小代价. 考虑每个点对\((i,j)\),我们这样建边: 1.源点向每个点i连\(\sum\limits E_{i,j}\)容量的边. 2.每个点向汇点连雇 ...
- LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图
#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测 ...
- POJ 2987 Firing(最大权闭合图)
[题目链接] http://poj.org/problem?id=2987 [题目大意] 为了使得公司效率最高,因此需要进行裁员, 裁去不同的人员有不同的效率提升效果,当然也有可能是负的效果, 如果裁 ...
- hdu 3917 修路与公司 最大权闭合图 好题
Road constructions Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- poj 2987 最大权闭合图
Language: Default Firing Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 8744 Accept ...
- 【TYVJ】1338 QQ农场(最大流+最大权闭合图)
http://tyvj.cn/Problem_Show.aspx?id=1338 时间才排到rank7,还不快啊囧.isap我常数都写得那么小了... 最大权闭合图看我另一篇博文吧 此题很明显的模型. ...
- 最大权闭合图 && 【BZOJ】1497: [NOI2006]最大获利
http://www.lydsy.com/JudgeOnline/problem.php?id=1497 最大权闭合图详细请看胡伯涛论文<最小割模型在信息学竞赛中的应用>,我在这里截图它的 ...
- 最大权闭合图最大获益(把边抽象为点)HDU3879
题意:给出一个无向图,每个点都有点权值代表花费,每条边都有利益值,代表形成这条边就可以获得e[i]的利益,问选择那些点可以获得最大利益是多少? 分析:把边抽象成点,s与该点建边,容量是利益值,每个点与 ...
- 最大权闭合图hdu3996
定义:最大权闭合图:是有向图的一个点集,且该点集的所有出边都指向该集合.即闭合图内任意点的集合也在改闭合图内,给每个点分配一个点权值Pu,最大权闭合图就是使闭合图的点权之和最大. 最小割建边方式:源点 ...
- BZOJ 1565 植物大战僵尸(最大权闭合图)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1565 题意:植物大战僵尸,一个n*m的格子,每 个格子里有一个植物,每个植物有两个属性: ...
随机推荐
- windows和liunx下换行符问题
区别 windows换行符是: \r\n liunx换行符是: \n 问题 程序处理的时候就会有问题,因为在Windows的文件多了一个\r 解决办法(转换文件格式) vim file :set fi ...
- Semaphore 的使用
var workerSemphore = new Semaphore(0, 800000); var IsWorkThreadCreated = true; var workThread = new ...
- 从一个URL加载一个Document
存在问题 你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 解决方法 使用 Jsoup.connect(String url)方法: Document doc ...
- C++多态中虚函数表合并与继承问题
多态: C++的多态是通过一张虚函数表(Virtual Table)来实现的,简称为 V-Table.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆写的问题,保证其真实反应实际的函数. ...
- 【AE】多表的联合查询
多表的联合查询 // Create the query definition. IQueryDef queryDef = featureWorkspace.CreateQueryDef(); // P ...
- win10 安装mysql5.7 【自定义安装路径】
- Ubuntu 16.04 + Win10双系统 启动Ubuntu进入命令行 无界面
Ubuntu 16.04 + Win10双系统,启动Ubuntu时候报错,并入命令行(无界面). 原因:可能是双系统兼容性问题 解决办法: 重启系统,进入Win10 然后在Win10中重启电脑. 重启 ...
- Excel vba call Python script on Mac
How can I launch an external python process from Excel 365 VBA on OSX? It took me a while, but I fig ...
- Linux(一)——简介
aaa https://www.cnblogs.com/three-fighter/p/14644152.html#navigator
- Django——ORM打印SQL
如果想打印ORM转换过程中的SQL,需要在settings.py中进行如下配置: LOGGING = { 'version': 1, 'disable_existing_loggers': False ...