题意

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

考虑每个点对\((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. CSP-S 2019文澜中学游记(11.15~11.17)

    前言 今年的\(CSP-S\),本以为自己的实力与去年的\(NOIP\)相比,能有较大的提升的. 没想到,菜是原罪,弱就是弱,依然逃脱不了被吊锤的命运. \(Nov\ 15th\):\(Day\ 0\ ...

  2. Educational Codeforces Round 76 (Rated for Div. 2) A. Two Rival Students 水题

    A. Two Rival Students There are

  3. npm查看本地包版本号和远程包的版本号

    npm 查看远程包 第一种方法: npm info <packageName> 第二种方法: npm view <packageName> versions --json np ...

  4. LinkedTransferQueue

    /** *LinkedTransferQueue是有容量的, * 当第一个生产者线程调用transfer时,如果没有消费者,会阻塞. * 第二个生产者线程调用transfer时,如果没有消费者,会添加 ...

  5. PageHelper使用以及PageInfo中分页对象的转化

    在使用Mybatis查询数据库展示到前端的过程中不可避免的要考虑到分页问题,这时就引入了Mybatis的PageHelper插件,这个插件对分页功能进行了强有力的封装,只需要将查询出来的数据List集 ...

  6. 聊一聊 bootstrap 的轮播图插件

    今天做工作的时候,轻车熟路的做完,又用到了bootstrap的轮播图,觉得有必要安利一下这个插件,如果你需要的轮播图.功能不需要太炫酷,那么bootstrap的插件是你的首要选择. 使用方式 引入js ...

  7. bash / powershell切换到脚本所在目录

    切换工作目录到脚本所在目录 bash: #!/usr/bin/env sh cd $(dirname $0) #cd $(dirname $(readlink $0)) #soft link powe ...

  8. DbgUiConnectToDbg(ntdll.dll)函数逆向

    暂时未解决问题: 1.  [fs+0F24h]中存储着什么东西. 答案:其存放着被调试程序的DbgObject句柄._NtCreateDebugObject(ntoskrnl.exe)函数逆向分析 该 ...

  9. C# 简单的进程间通信方式

    只想实现一个简单的进程建通信,有什么快速实现方式? 1 进程单例需求 / Windows 消息与 IMessageFilter 如果需求是实现一个进程单例,在启动第二个进程时,期望能自动唤起第一个进程 ...

  10. 史上最详细JVM,Java内存区域讲解

    本人免费整理了Java高级资料,一共30G,需要自己领取:传送门:https://mp.weixin.qq.com/s/JzddfH-7yNudmkjT0IRL8Q 运行时数据区域 JVM载执行Jav ...