interlinkage:

https://ac.nowcoder.com/acm/contest/847/F

description:

solution:

  • 最大权闭合子图;
  • 每个单元格看成一个正权点,每一行每一列分别看成一个负权点。各自的点权就是其对应获得或者是消耗的能量(获得为正,消耗为负);
  • 每个单元格向所在行对应的点连inf边,所在列对应的点连inf边,表示选择这个单元格就必须选择其所在行和所在列;
  • 对于每一个关联奖励,新建一个点权为k的点。新建点向四个对应的行,列节点连inf边;
  • 源点向所有正权点连边,边权为正权点的权值。所有负权点向汇点连边,边权为负权点的权值的绝对值;
  • 答案=正权点权值之和-最小割;

code:

#include<algorithm>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<queue>
using namespace std; const int N=1e6+;
const int inf=1e9+;
int n,m,tot=,S,T;
int head[N],cur[N],dep[N];
struct EDGE
{
int to,nxt,cap;
}edge[N<<];
inline int read()
{
char ch=getchar();int s=,f=;
while (ch<''||ch>'') {if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<='') {s=(s<<)+(s<<)+ch-'';ch=getchar();}
return s*f;
}
void add(int u,int v,int w)
{
edge[++tot]=(EDGE){v,head[u],w};head[u]=tot;
edge[++tot]=(EDGE){u,head[v],};head[v]=tot;
}
int getid(int x,int y)
{
return (x-)*n+y+*n;
}
queue <int> q;
int bfs()
{
memset(dep,,sizeof(dep));
while (!q.empty()) q.pop();
dep[S]=;
q.push(S);
while (!q.empty())
{
int k=q.front();q.pop();
for (int i=head[k];i;i=edge[i].nxt)
{
int y=edge[i].to;
if (!dep[y]&&edge[i].cap)
{
dep[y]=dep[k]+;
q.push(y);
}
}
}
return dep[T];
}
int dfs(int x,int a)
{
if (!a||x==T) return a;
int f,flow=;
for (int &i=cur[x];i;i=edge[i].nxt)
{
int y=edge[i].to;
if (dep[y]==dep[x]+&&(f=dfs(y,min(edge[i].cap,a)))>)
{
edge[i].cap-=f;
edge[i^].cap+=f;
flow+=f;
a-=f;
if (!a) break;
}
}
return flow;
}
int dinic()
{
int ans=;
while (bfs())
{
memcpy(cur,head,sizeof(head));
ans+=dfs(S,inf);
}
return ans;
}
int main()
{
n=read();m=read();
S=;T=n*n+*n+;
int sum=;
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
{
int c=read(),now=getid(i,j);
sum+=c;
add(S,now,c);
add(now,i,inf);
add(now,j+n,inf);
}
for (int i=;i<=n;i++) add(i,T,read());
for (int i=;i<=n;i++) add(i+n,T,read());
for (int i=;i<=m;i++)
{
int i1=read(),j1=read(),i2=read(),j2=read(),k=read();
sum+=k;
add(S,T+i,k);
add(T+i,i1,inf);add(T+i,j1+n,inf);
add(T+i,i2,inf);add(T+i,j2+n,inf);
}
printf("%d\n",sum-dinic());
return ;
}

[牛客网练习赛 45 F] Magic Slab 解题报告 (最大权闭合子图)的更多相关文章

  1. 牛客网练习赛23 F 托米的游戏

    链接:https://www.nowcoder.com/acm/contest/156/F 来源:牛客网 题目描述 题目背景编不下去了 托米有一棵有根树 T, 树根为1,每轮他会在剩下的子树中等概率一 ...

  2. 牛客网练习赛28A

    题目链接:https://www.nowcoder.com/acm/contest/200/A 链接:https://www.nowcoder.com/acm/contest/200/A来源:牛客网 ...

  3. 牛客网练习赛18 A 【数论/整数划分得到乘积最大/快速乘】

    链接:https://www.nowcoder.com/acm/contest/110/A 来源:牛客网 题目描述 这题要你回答T个询问,给你一个正整数S,若有若干个正整数的和为S,则这若干的数的乘积 ...

  4. 牛客网练习赛26B(简单的dp)

    题目链接:https://www.nowcoder.com/acm/contest/180/B 链接:https://www.nowcoder.com/acm/contest/180/B来源:牛客网 ...

  5. 牛客网练习赛34-D-little w and Exchange(思维题)

    链接:https://ac.nowcoder.com/acm/contest/297/D 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 牛客网练习赛25 C 再编号

    链接:https://www.nowcoder.com/acm/contest/158/C来源:牛客网 定义对 a 的再编号为 a' ,满足 . 现在有 m 次询问,每次给定 x,t ,表示询问经过 ...

  7. 牛客网练习赛43-C(图论)

    题目链接:https://ac.nowcoder.com/acm/contest/548/C 题意:有n个知识点,学会每个知识点花T[i],已经学会了其中k个知识点,有m组关系,t1,t2,t3,表示 ...

  8. 牛客网练习赛12---A and B

    A题传送门:https://www.nowcoder.net/acm/contest/68/A B题传送门:   https://www.nowcoder.net/acm/contest/68/B A ...

  9. 牛客网练习赛61 A+B

    A.打怪 思路:先判定当小怪的攻击力为0时,你能杀无数只怪,因为小怪A不动你,然后再计算每个小怪最多能给你造成多少伤害(用小怪的血量除以你的攻击力,也就是你砍它几下它会死,你先手,所以小怪肯定比你少砍 ...

随机推荐

  1. redis-linux

    redis3.0.4 server版本 jedis-2.7.2.jar spring-data-redis-1.6.0.RELEASE.jar commons-pool2-2.3.jar spring ...

  2. boost::mutex::scoped_lock

    在三维重建过程中,世界地图 Map &world作为唯一 访问/更新 对象,可以使用boost::mutex::scoped_lock . 一:boost::mutex::scoped_loc ...

  3. DNN:逻辑回归与 SoftMax 回归方法

    UFLDL Tutorial 翻译系列:http://deeplearning.stanford.edu/wiki/index.php/UFLDL_Tutorial 第四章:SoftMax回归 简介: ...

  4. mvc登录授权特性

    public class CommonAuthorize : AuthorizeAttribute { protected override bool AuthorizeCore(HttpContex ...

  5. <转>python 发送邮件实例

    文件形式的邮件 #!/usr/bin/env python3 #coding: utf-8 import smtplib from email.mime.text import MIMEText fr ...

  6. json简介及josn数组中取字符

    1.json字符串就是字符串,只不过格式是Json格式的,以键值对的形式存在,键和值可以是字符串,数字,空值,数组等. json对象在花括号中书写,一个json对象包含多个键值对,json对象以花括号 ...

  7. react-native页面间传递数据的几种方式

    1. 利用react-native 事件DeviceEventEmitter 监听广播 应用场景: - 表单提交页面, A页面跳转到B页面选人, 然后返回A页面, 需要将B页面选择的数据传回A页面. ...

  8. 轻量级本地数据库SQLite在WinRT的使用

    开发环境:Windows 8.1 开发工具:Visual Studio Express 2013 for Windows SQLite数据库介绍 1.SQLite是一款轻型的嵌入式数据库,使用C++开 ...

  9. 0918如何利用jmeter通过程序插入测试数据

    第一步 添加线程组 第二步 添加HTTP信息头管理器 第三步 添加HTTP请求 第四步 添加HTTP请求[POST] 第五步 添加查看结果树

  10. [bzoj2259][Oibh]新型计算机_Dijkstra

    新型计算机 bzoj-2259 Oibh 题目大意:给定一个n个数的数列,第i个数为a[i],更改第i个数至x的代价为|x-a[i]|.求最小代价,使得:读入一个数s1后,向后连着读s1个数,然后如s ...