http://www.lydsy.com/JudgeOnline/problem.php?id=2039

题意:中文题意。

思路:一开始想着和之前做的最大权闭合图有点像,但是如果把边全部当成点的话,那么点也太多了。

对于这种选和不选的方案问题,还是一样用最小割来解决,求最小的损失收益,然后用能够得到的总收益去减去最小割的值就是答案。思维模式是:将S集或者T集的某一边当成是选择的,另一边当成是不选择的,根据这样去连边,就可能更容易想到建图方案。

在这题里面,我把T集当成是选择的人,把S集当成是不选择的人。这样的话如果选择一个人,那么就损失了雇佣他的钱,于是将A[i]和S相连,代表如果不割这条边的话,那么它就会划入S集。同理如果不雇佣一个人,损失的E[i]和T相连,代表如果不割这条边的话,那么它就划入T集,代表选择这个人。有了上面这两个主要的建边,接下来就很容易想到将人与人之间连一条容量为互相的贡献E[i,j]*2(题意)的无向边,代表如果选了i,那么可以对j作出E[i,j]的贡献,选j同理。

这样图的点数其实就是人数+2而已。记得要开longlong,还有损失的E[i]要先合并起来,否则边过多。

 #include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
#define N 1010
#define INF 0x3f3f3f3f
typedef long long LL;
struct Edge {
int u, v; LL cap; int nxt;
} edge[N*N*];
int cur[N], gap[N], dis[N], pre[N], tot, head[N], S, T;
LL mp[N][N], e[N]; void Add(int u, int v, LL cap) {
edge[tot] = (Edge) {u, v, cap, head[u]}; head[u] = tot++;
edge[tot] = (Edge) {v, u, , head[v]}; head[v] = tot++;
} int BFS() {
queue<int> que;
que.push(T);
memset(dis, INF, sizeof(dis));
memset(gap, , sizeof(gap));
dis[T] = ; gap[]++;
while(!que.empty()) {
int u = que.front(); que.pop();
for(int i = head[u]; ~i; i = edge[i].nxt) {
if(dis[edge[i].v] == INF) {
dis[edge[i].v] = dis[u] + ;
gap[dis[edge[i].v]]++;
que.push(edge[i].v);
}
}
}
} LL ISAP(int n) {
BFS();
memcpy(cur, head, sizeof(cur));
LL ans = , flow;
int i, u = pre[S] = S, index;
while(dis[S] < n) {
if(u == T) {
flow = ;
for(i = S; i != T; i = edge[cur[i]].v)
if(flow > edge[cur[i]].cap) flow = edge[cur[i]].cap, index = i;
for(i = S; i != T; i = edge[cur[i]].v)
edge[cur[i]].cap -= flow, edge[cur[i]^].cap += flow;
ans += flow; u = index;
}
for(i = cur[u]; ~i; i = edge[i].nxt) if(dis[edge[i].v] == dis[u] - && edge[i].cap) break;
if(~i) { cur[u] = i; pre[edge[i].v] = u; u = edge[i].v; }
else {
int md = n + ;
if(--gap[dis[u]] == ) break;
for(i = head[u]; ~i; i = edge[i].nxt)
if(md > dis[edge[i].v] && edge[i].cap) md = dis[edge[i].v], cur[u] = i;
gap[dis[u] = md + ]++;
u = pre[u];
}
}
return ans;
} int main() {
int n; LL w, sum = ;
scanf("%d", &n);
S = ; T = n + ;
memset(head, -, sizeof(head)); tot = ;
for(int i = ; i <= n; i++)
scanf("%lld", &w), Add(S, i, w);
for(int i = ; i <= n; i++) for(int j = ; j <= n; j++) scanf("%lld", &mp[i][j]), e[i] += mp[i][j], sum += mp[i][j];
for(int i = ; i <= n; i++) {
Add(i, T, e[i]);
for(int j = i + ; j <= n; j++) {
Add(i, j, mp[i][j] * ); Add(j, i, mp[i][j] * );
}
}
LL ans = ISAP(T + );
printf("%lld\n", sum - ans);
return ;
}

BZOJ 2039:[2009国家集训队]employ人员雇佣(最小割)的更多相关文章

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

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

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

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

  3. BZOJ 2039 [2009国家集训队]employ人员雇佣 网络流

    链接 BZOJ 2039 题解 这题建图好神,自己瞎搞了半天,最后不得不求教了企鹅学长的博客,,,,发现建图太神了!! s向每个人连sum(e[i][x]) 的边,每个人向T连a[i]的边.两两人之间 ...

  4. BZOJ 2039 / Luogu P1791 [2009国家集训队]employ人员雇佣 (最小割)

    题面 BZOJ传送门 Luogu传送门 分析 考虑如何最小割建图,因为这仍然是二元关系,我们可以通过解方程来确定怎么建图,具体参考论文 <<浅析一类最小割问题 湖南师大附中 彭天翼> ...

  5. bzoj 2039 [2009国家集训队]employ人员雇佣——二元关系

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2039 用最小割看.对于一组关系 i , j ,如果都选,收益 2*Ei,j,可以看作0,作为 ...

  6. bzoj 2039: [2009国家集训队]employ人员雇佣【最小割】

    一开始在https://www.cnblogs.com/lokiii/p/10770919.html基础上连(i,j,b[i][j])建了个极丑的图T掉了--把dinic换成isap勉强能卡过 首先因 ...

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

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

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

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

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

    任意门 Description 作为一个富有经营头脑的富翁,小L决定从本国最优秀的经理中雇佣一些来经营自己的公司.这些经理相互之间合作有一个贡献指数,(我们用Ei,j表示i经理对j经理的了解程度),即 ...

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

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

随机推荐

  1. WPF编游戏系列 之八 银行界面及金额校验

    原文:WPF编游戏系列 之八 银行界面及金额校验        在前面<WPF编游戏系列 之四 用户控件>一文中通过用户控件创建了"My Shop"中物品列表框.本篇继 ...

  2. XF 彩色矩形块

    <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http:/ ...

  3. JS trim函数

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  4. WPF Button控件模板

     <Window x:Class="ControlTemplateDemo.MainWindow"        xmlns="http://schemas.m ...

  5. js 点击超链接,执行js脚本,而不进行url跳转

    <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...

  6. linux 修改 ssh 的端口号,启动hg服务

    修改 ssh 的端口号 # vim /etc/ssh/sshd_config  将其中的 Port 改为 想要修改的端口号. # service sshd restart   启动hg服务 # hg ...

  7. python 识别身份证号码

    # !/usr/bin/python # -*-coding:utf-8-*- import sys import time time1 = time.time() from PIL import I ...

  8. UWP中String类型如何转换为Windows.UI.Color

    原文:UWP中String类型如何转换为Windows.UI.Color 我在学习过程中遇到的,我保存主题色为string,但在我想让StatusBar随着主题色变化时发现没法使用. ThemeCol ...

  9. GIS基础软件及操作(四)

    原文 GIS基础软件及操作(四) 练习四.空间数据处理 1.空间数据处理(融合.合并.剪切.交叉.合并)2.设置地图投影及投影变换 空间数据处理 数据:云南县界.shp; Clip.shp西双版纳森林 ...

  10. SMC状态机笔记

    %class 状态机所作用的类 %package 类所在的包 %fsmclass 生成类的类名 %fsmfile 生成类的文件名 %access 生成类的可访问级别 %start 指定状态机的开始状态 ...