题目链接

结论

∣带权最大独立集∣=∣点权之和∣−∣最小割∣=∣点权之和∣−∣最大流∣|带权最大独立集| = |点权之和| - |最小割| = |点权之和| - |最大流|∣带权最大独立集∣=∣点权之和∣−∣最小割∣=∣点权之和∣−∣最大流∣

思路

黑白染色之后建图,源点SSS到黑点建对应权值边,白点到汇点TTT建对应取值边,黑点到相邻的白点建infinfinf边,然后求得的最大流,就是将黑白分开的最小割。

#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
#define endl '\n'
const int maxn = 50 + 5;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
using namespace std;
struct ac{int v, c, pre;
}edge[maxn<<8];
int s, e;
int head[maxn<<8], dis[maxn<<6], curedge[maxn<<8], cnt;
void init() {mem(head, -1);cnt = 0;
}
void addedge(int u, int v, int c) { // 记得双向边edge[cnt] = {v, c, head[u]};head[u] = cnt++;
}
bool bfs() {queue<int> que;que.push(s);mem(dis, 0);dis[s] = 1;while (!que.empty()) {int f = que.front();que.pop();for (int i = head[f]; i != -1; i = edge[i].pre) {if (dis[edge[i].v] || edge[i].c == 0) continue;dis[edge[i].v] = dis[f] + 1;que.push(edge[i].v);}}return dis[e] > 0;
}int dfs(int now, int flow) {if (now == e || flow == 0) return flow;for (int &i = curedge[now]; i != -1; i = edge[i].pre) { // 当前弧优化if (dis[edge[i].v] != dis[now] + 1 || edge[i].c == 0) continue;int d = dfs(edge[i].v, min(flow, edge[i].c));if (d > 0) {edge[i].c -= d;edge[i^1].c += d;return d;}            }dis[now] = -1; // // 炸点优化return 0;
}
int Dinic() {int sum = 0, d;while (bfs()) {for (int i = 0; i <= e; ++i) curedge[i] = head[i];while (d = dfs(s, inf)) sum += d;}return sum;
}int a[maxn][maxn];
int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n, m;while (cin >> n >> m) {init();int sum = 0;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {cin >> a[i][j];sum += a[i][j];}}s = 0, e = n * m + 1;for (int i = 0; i < n; ++i) {for (int j = 0; j < m; ++j) {if ((i + j) % 2 == 0) {addedge(s, i*m+j+1, a[i][j]);addedge(i*m+j+1, s, 0);for (int k = -1; k <= 1; ++k) {for (int h = -1; h <= 1; ++h) {if (abs(k) + abs(h) != 1) continue;int x = i + k;int y = j + h;if (x < 0 || y < 0 || x >= n || y >= m) continue;if ((x + y) % 2 == 0) continue;addedge(i*m+j+1, x*m+y+1, inf);addedge(x*m+y+1, i*m+j+1, 0);}}}else {addedge(i*m+j+1, e, a[i][j]);addedge(e, i*m+j+1, 0);} }}int ans = sum - Dinic();cout << ans << endl;}return 0;
}

HDU1569 方格取数(2)(二分图带权最大独立集 - 最小割应用)相关推荐

  1. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

  2. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

  3. HDU-1569 方格取数(2) 最小割最大流

    题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩.所以要运用的最小割最大流的思想来解这道题. 大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得 ...

  4. [luoguP2774] 方格取数问题(最大点权独立集)

    传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集. 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集. 现在对网格染色,使得相邻两点颜色不同,之后把两个 ...

  5. P2774-方格取数问题【网络流,最大流,最小割】

    正题 链接: https://www.luogu.org/problemnew/show/P2774 题意 在一个n*m的数字矩阵中取数,取得数不能相邻,求能取到的最大价值. 解题思路 最大价值,那么 ...

  6. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)...

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形.方格取数2解法: ...

  7. 线性规划与网络流24题●09方格取数问题13星际转移问题

    ●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为"技术"不佳,搞了一上午) ●09方格取数问题(codevs1907  方格取数3) 想了半天,也没 ...

  8. 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)

    二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...

  9. [codevs 1907] 方格取数3

    [codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...

最新文章

  1. 计算机组成原理(哈工大刘宏伟)135讲(三)
  2. 简单说说:JavaSE、JavaEE、JavaME这三大体系
  3. Ant Design 使用小结
  4. ROS2学习(一).Ubuntu 20.04安装ROS2 Galactic
  5. 《为大量出现的KPI流快速部署异常检测模型》 笔记
  6. tetp服务器怎么上传文件,tftp服务器ip是什么 TFTP服务器怎么设置
  7. CI框架实现某字段自加数值
  8. 大厂OPPO面试— Android 开发技术面总结
  9. win7自带照片查看器
  10. 计算机网络经典面试题:在浏览器中输入URL并按下回车后会发生什么?
  11. nvm安装和使用(window)
  12. Go 内存管理与垃圾回收
  13. 从零开始学android:Android中的基本控件(上)
  14. WIN10:今天开机突然遇到在打拼音的时候,输入框不见了,已下是本人的解决办法
  15. k3显示远程服务器未打开,k3客户端远程服务器链接
  16. 基于51单片机智能热水器控制系统设计
  17. LDAP 和 LDAP3 的对比、接口调用(2)
  18. 【突然get到的】.BAK文件是备份文件
  19. AI-腾讯云人脸核身之独立H5接入
  20. 自己写一个pow()函数

热门文章

  1. [c#]Dll自定义目录
  2. nodejs 框架 中文express 4.xxx中文API手册
  3. Ubuntu版本介绍
  4. 关于内存流与字符串的转换
  5. 判断输入的数是否质数,求范围内的质数有哪些
  6. [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
  7. [数据库] Navicat for MySQL定时备份数据库及数据恢复
  8. iOS之深入解析GCD的底层原理
  9. Python之打造专属Python开发者的完美终端工具Rich
  10. Codeforces Round #552 (Div. 3) —— B. Make Them Equal