题意

考虑先将所有价值加上,之后用最小割求最小代价。

考虑每个点对\((i,j)\),我们这样建边:

1.源点向每个点i连\(\sum\limits E_{i,j}\)容量的边。

2.每个点向汇点连雇佣代价容量的边。

3.对每个点对\((i,j)\),从\(i\)向\(j\)连\(2*E_{i,j}\)容量的边。

考虑现在要割掉上图有什么割法:

1.割掉两个连向汇点的边,表示都选上了。

2.割掉两个连向源点的边,表示都不选。

3.割掉一条连向源点的,一条连向汇点的,一条连接两点的,表示一个选一个不选,那么我们要减去\(2*E_{i,j}\),因为不仅之前加多了,这么选后还会再减\(E_{i,j}\)。

code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1010;
const int maxm=10010;
const ll inf=1e9;
int n,cnt=1,st,ed;
int head[maxn],cur[maxn],dep[maxn];
ll ans;
ll cost[maxn],sum[maxn];
ll a[maxn][maxn];
struct edge{int to,nxt;ll flow;}e[maxn*maxn<<1];
inline ll read()
{
char c=getchar();ll res=0,f=1;
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')res=res*10+c-'0',c=getchar();
return res*f;
}
inline void add(int u,int v,ll w)
{
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
e[cnt].flow=w;
}
inline bool bfs()
{
memset(dep,0,sizeof(dep));
for(int i=0;i<=n+1;i++)cur[i]=head[i];
queue<int>q;
q.push(st);dep[st]=1;
while(!q.empty())
{
int x=q.front();q.pop();
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(dep[y]||e[i].flow<=0)continue;
dep[y]=dep[x]+1;q.push(y);
}
}
return dep[ed]>0;
}
ll dfs(int x,int goal,ll lim)
{
if(x==goal||lim<=0)return lim;
ll res=lim;
for(int i=cur[x];i;i=e[i].nxt)
{
cur[x]=i;
int y=e[i].to;
if(e[i].flow<=0||dep[y]!=dep[x]+1)continue;
ll tmp=dfs(y,goal,min(res,e[i].flow));
if(tmp<=0)dep[y]=0;
res-=tmp;
e[i].flow-=tmp,e[i^1].flow+=tmp;
if(res<=0)break;
}
return lim-res;
}
inline ll Dinic()
{
ll res=0;
while(bfs())res+=dfs(st,ed,inf);
return res;
}
int main()
{
n=read();
for(int i=1;i<=n;i++)cost[i]=read();
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
a[i][j]=read(),ans+=a[i][j];
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
sum[i]+=a[i][j];
st=0,ed=n+1;
for(int i=1;i<=n;i++)add(st,i,sum[i]),add(i,st,0);
for(int i=1;i<=n;i++)add(i,ed,cost[i]),add(ed,i,0);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j&&a[i][j])add(i,j,2*a[i][j]),add(j,i,0);
printf("%lld",ans-Dinic());
return 0;
}

luoguP1791 [国家集训队]人员雇佣的更多相关文章

  1. P1791-[国家集训队]人员雇佣【最大权闭合图】

    正题 题目链接:https://www.luogu.com.cn/problem/P1791 题目大意 有\(n\)个人,雇佣第\(i\)个需要\(A_i\)的费用,对于\(E_{i,j}\)表示如果 ...

  2. BZOJ 2039: [2009国家集训队]employ人员雇佣

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1369  Solved: 667[Submit ...

  3. BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割

    BZOJ_2039_[2009国家集训队]employ人员雇佣_ 最小割 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作 ...

  4. 【BZOJ 2039】 2039: [2009国家集训队]employ人员雇佣 (最小割)

    2039: [2009国家集训队]employ人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1511  Solved: 728 Descri ...

  5. 【BZOJ2039】[2009国家集训队]employ人员雇佣 最小割

    [BZOJ2039][2009国家集训队]employ人员雇佣 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献 ...

  6. 【BZOJ2039】【2009国家集训队】人员雇佣 [最小割]

    人员雇佣 Time Limit: 20 Sec  Memory Limit: 259 MB[Submit][Status][Discuss] Description 作为一个富有经营头脑的富翁,小L决 ...

  7. BZOJ 2038: [2009国家集训队]小Z的袜子(hose) [莫队算法]【学习笔记】

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7687  Solved: 3516[Subm ...

  8. BZOJ 2038: [2009国家集训队]小Z的袜子(hose)

    2038: [2009国家集训队]小Z的袜子(hose) Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 7676  Solved: 3509[Subm ...

  9. [转] ACM中国国家集训队论文集目录(1999-2009)

    国家集训队1999论文集 陈宏:<数据结构的选择与算法效率——从IOI98试题PICTURE谈起>来煜坤:<把握本质,灵活运用——动态规划的深入探讨>齐鑫:<搜索方法中的 ...

随机推荐

  1. C++ 拷贝构造函数 copy ctor & 拷贝赋值函数 copy op=

    类中含有  指针类型  的成员变量时,就必须要定义 copy ctor 和 copy op= copy ctor 请见: class Rectangle { public: Rectangle(Rec ...

  2. skkyk:点分治

    由题开始== 例题:求在一棵有权树上,是否存在一条路径满足权值和为K 解法:以每个点为根一次,看在他的子树间是否存在两段,其和为K;O(==) 和例题一样,对于树上问题,求某些要求的路径(数量或者存在 ...

  3. 设计模式-FlyWeight(结构型模式) 针对 需要创建大量对象的情形,被共享的状态作为内部状态,不被共享的状态作为外部状态

    以下代码来源: 设计模式精解-GoF 23种设计模式解析附C++实现源码 //Flyweight.h #pragma once #include<string> class FlyWeig ...

  4. WPF 快捷键

    原文:WPF 快捷键 <p><pre name="code" class="csharp"> 前台 <Window.Resourc ...

  5. 你需要知道的OpenGL

    它是谁? OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D.3D矢量图形的跨语言.跨平台的应用程序编程接口(API).这个接口由近3 ...

  6. python接口自动化6-参数化关联

    前言 接口中我们经常需要用到参数关联,比如,登录token,需要传给后面的参数使用,又比如要查看某个商品需要将商品的id传入下一个接口使用. 等等,所以我们必要学会 re 正则获取,或者返回json获 ...

  7. js移动端自适应动态设置html的fontsize

    JS设计移动端页面时会遇到自适应问题,大多数都知道用rem来设置页面的比例大小,下面就来说几种常见的html中的fontsize设置方法: 1.使用flexible.js插件库.  淘宝就是利用这个来 ...

  8. ansible小结(八)ansible-playbook简单使用

    ansbile-playbook是一系统ansible命令的集合,其利用yaml 语言编写,运行过程,ansbile-playbook命令根据自上而下的顺序依次执行.同时,playbook开创了很多特 ...

  9. Java入门系列之字符串特性(二)

    前言 上一节我们讲解到字符串本质上就是字符数组,同时详细讲解了字符串判断相等需要注意的地方,本节我们来深入探讨字符串特性,下面我们一起来看看. 不可变性 我们依然借助初始化字符串的方式来探讨字符串的不 ...

  10. Elasticsearch Query DSL 语言介绍

    目录 0. 引言 1. 组合查询 2. 全文搜索 2.1 Match 2.2 Match Phase 2.3 Multi Match 2.4 Query String 2.5 Simple Query ...