https://www.luogu.com.cn/problem/P2774

在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数。

现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。

输入格式:
文件第1行有2个正整数 m 和 n,分别表示棋盘的行数和列数。接下来的 m 行,每行有 n 个正整数,表示棋盘方格中的数。

注意:m 是行数,n 是列数。

数据保证有 1≤n,m≤30

输出格式:
输出取数的最大总和。

输入样例:
在这里给出一组输入。例如:


3 3
1 2 3
3 2 3
2 3 1
``
输出样例:
在这里给出相应的输出。例如: 11`
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 1e5+;
const int inf = 0x3f3f3f3f;
int n,m,s,t,tol,head[maxn],dep[maxn],x[][]; struct Edge
{
int v,w,nxt;
}E[maxn]; void add_edge(int u,int v,int w){
E[tol] = Edge{v,w,head[u]};
head[u] = tol++;
} void insert(int u, int v, int c){
add_edge(u, v, c);
add_edge(v, u, );
} bool Bfs(){
memset(dep,, sizeof(dep));
queue<int> q;
while(!q.empty())
q.pop();
q.push(s);
dep[s] = ;
while(!q.empty()){
int u = q.front();
q.pop();
for(int i = head[u];i != -;i = E[i].nxt)
{
if(E[i].w && !dep[E[i].v])
{
dep[E[i].v] = dep[u] + ;
q.push(E[i].v);
if(E[i].v == t)
return true;
}
}
}
return false;
} int Dfs(int u,int f){
if(u == t)
return f;
int used = ,d = ;
for(int i = head[u];i != -;i = E[i].nxt){
if(dep[u] == dep[E[i].v] - && E[i].w){
if((d = Dfs(E[i].v,min(f - used,E[i].w)))){
used += d;
E[i].w -= d;
E[i^].w += d;
}
}
}
if(!used)
dep[u] = ;
return used;
} int Dinic(){
int max_flow = ,d;
while(Bfs()){
while((d = Dfs(s,inf)))
max_flow += d;
}
return max_flow;
}
signed main(){
//freopen(“in”,“r”,stdin);
ios::sync_with_stdio(false);
cin.tie();
memset(head,-, sizeof(head));
int ans = ,sz = ; cin >> m >> n;
s = ,t = m*n + ;
for(int i = ;i <= m; i++){
for(int j = ;j <= n; j++){
sz++;
cin >> x[i][j];
ans += x[i][j];
if((i+j)%){
insert(s,sz,x[i][j]);//连向源点
if(i > )
insert(sz,sz - n,inf);//把有限制条件的连起来,边权注意要尽量大
if(i < m)
insert(sz,sz + n,inf);
if(j > )
insert(sz,sz - ,inf);
if(j < n)
insert(sz,sz + ,inf); }
else
insert(sz,t,x[i][j]);//连向汇点
}
}
cout << ans - Dinic() << endl;//总的边权-最大流(最小割)
return ;
}

P2774 方格取数(网络流)的更多相关文章

  1. P2774 方格取数问题 网络流重温

    P2774 方格取数问题 这个题目之前写过一次,现在重温还是感觉有点难,可能之前没有理解透彻. 这个题目要求取一定数量的数,并且这些数在方格里面不能相邻,问取完数之后和最大是多少. 这个很好的用了网络 ...

  2. P2774 方格取数问题 网络流

    题目: P2774 方格取数问题 题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  3. P2774 方格取数问题(网络流)

    P2774 方格取数问题 emm........仔细一看,这不是最大权闭合子图的题吗! 取一个点$(x,y)$,限制条件是同时取$(x,y+1),(x,y-1),(x+1,y),(x-1,y)$,只不 ...

  4. P2774 方格取数问题(最小割)

    P2774 方格取数问题 一看题目便知是网络流,但由于无法建图.... 题目直说禁止那些条件,这导致我们直接建图做不到,既然如此,我们这是就要逆向思维,他禁止那些边,我们就连那些边. 我们将棋盘染色, ...

  5. 洛谷 P2774 方格取数问题 解题报告

    P2774 方格取数问题 题目背景 none! 题目描述 在一个有 \(m*n\) 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大. ...

  6. P2774 方格取数问题 网络最大流 割

    P2774 方格取数问题:https://www.luogu.org/problemnew/show/P2774 题意: 给定一个矩阵,取出不相邻的数字,使得数字的和最大. 思路: 可以把方格分成两个 ...

  7. BZOJ 1475: 方格取数( 网络流 )

    本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...

  8. [BZOJ1475]方格取数 网络流 最小割

    1475: 方格取数 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 512[Submit][Status][Discuss] ...

  9. P2774 方格取数问题

    题目背景 none! 题目描述 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法.对于 ...

随机推荐

  1. APP 安全测试

    http://www.cnblogs.com/wetest/p/6694529.html

  2. 如何在Go中获得 "A1","B2" 类似字符+数字的字符串

    package main import ( "fmt" ) func main() { // 字符串 str := "ABCDEFGHIJKLMNOPQRSTUVWXYZ ...

  3. css3之渐变背景色(linear-gradient)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. c语言getipaddrtable获得ip地址与sendArp获得mac地址以及一些字节序问题记录

    https://docs.microsoft.com/zh-cn/windows/win32/api/iphlpapi/nf-iphlpapi-getipaddrtable msdn,有很多c的源码还 ...

  5. bugku web 5

    首先进入网站http://123.206.87.240:8002/web5/index.php 进入之后就会看到 然后点击F12就会打开后台 然后就会发现有一串东西就是这个然后经过搜索是jsfuck ...

  6. hadoop3 配置second name node

    设置hdfs-site.xml <property> <name>dfs.http.address</name> <value>192.168.1.81 ...

  7. drf-jwt手动签发与校验,drf小组件:过滤、筛选、排序、分页

    复习 """ 频率组件:限制接口的访问频率 源码分析:初始化方法.判断是否有权限方法.计数等待时间方法 自定义频率组件: class MyThrottle(SimpleR ...

  8. 每天进步一点点------altium designer 实用的快捷键

    1.设计浏览器快捷键: 鼠标左击                         选择鼠标位置的文档鼠标双击                         编辑鼠标位置的文档鼠标右击        ...

  9. mysql 隔离性与隔离级别

    提到事务,你肯定不陌生,和数据库打交道的时候,我们总是会用到事务.最经典的例子就是转账,你要给朋友小王转 100 块钱,而此时你的银行卡只有 100 块钱. 转账过程具体到程序里会有一系列的操作,比如 ...

  10. python操作oracle完整教程

    1.    连接对象 操作数据库之前,首先要建立数据库连接.有下面几个方法进行连接. >>>import cx_Oracle>>>db = cx_Oracle.co ...