HDU1569 方格取数(2)(二分图带权最大独立集 - 最小割应用)
题目链接
结论
∣带权最大独立集∣=∣点权之和∣−∣最小割∣=∣点权之和∣−∣最大流∣|带权最大独立集| = |点权之和| - |最小割| = |点权之和| - |最大流|∣带权最大独立集∣=∣点权之和∣−∣最小割∣=∣点权之和∣−∣最大流∣
思路
黑白染色之后建图,源点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)(二分图带权最大独立集 - 最小割应用)相关推荐
- 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流
«问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...
- 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)
I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...
- HDU-1569 方格取数(2) 最小割最大流
题义很简单,还记得方格取数(1)的时候,使用状态压缩写的,这里由于行列数太大,因此无法进行压缩.所以要运用的最小割最大流的思想来解这道题. 大概是这样分析的,题义是要我们求在一个方格内取出N个点,使得 ...
- [luoguP2774] 方格取数问题(最大点权独立集)
传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集. 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集. 现在对网格染色,使得相邻两点颜色不同,之后把两个 ...
- P2774-方格取数问题【网络流,最大流,最小割】
正题 链接: https://www.luogu.org/problemnew/show/P2774 题意 在一个n*m的数字矩阵中取数,取得数不能相邻,求能取到的最大价值. 解题思路 最大价值,那么 ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)...
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形.方格取数2解法: ...
- 线性规划与网络流24题●09方格取数问题13星际转移问题
●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为"技术"不佳,搞了一上午) ●09方格取数问题(codevs1907 方格取数3) 想了半天,也没 ...
- 最小割 ---- 二分图最大独立集(集合冲突模型) ---- 骑士共存 方格取数(网络流24题)
二分图独立集 定理: 二分图最大独立集=n - 二分图最大匹配 其实二分图独立集是特殊的一种最大权闭合子图.我们根据上文"收益"的思想,把选某个点的收益看为1,左部节点为正权点,右 ...
- [codevs 1907] 方格取数3
[codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...
最新文章
- 计算机组成原理(哈工大刘宏伟)135讲(三)
- 简单说说:JavaSE、JavaEE、JavaME这三大体系
- Ant Design 使用小结
- ROS2学习(一).Ubuntu 20.04安装ROS2 Galactic
- 《为大量出现的KPI流快速部署异常检测模型》 笔记
- tetp服务器怎么上传文件,tftp服务器ip是什么 TFTP服务器怎么设置
- CI框架实现某字段自加数值
- 大厂OPPO面试— Android 开发技术面总结
- win7自带照片查看器
- 计算机网络经典面试题:在浏览器中输入URL并按下回车后会发生什么?
- nvm安装和使用(window)
- Go 内存管理与垃圾回收
- 从零开始学android:Android中的基本控件(上)
- WIN10:今天开机突然遇到在打拼音的时候,输入框不见了,已下是本人的解决办法
- k3显示远程服务器未打开,k3客户端远程服务器链接
- 基于51单片机智能热水器控制系统设计
- LDAP 和 LDAP3 的对比、接口调用(2)
- 【突然get到的】.BAK文件是备份文件
- AI-腾讯云人脸核身之独立H5接入
- 自己写一个pow()函数
热门文章
- [c#]Dll自定义目录
- nodejs 框架 中文express 4.xxx中文API手册
- Ubuntu版本介绍
- 关于内存流与字符串的转换
- 判断输入的数是否质数,求范围内的质数有哪些
- [Python从零到壹] 三.语法基础之文件操作、CSV文件读写及面向对象
- [数据库] Navicat for MySQL定时备份数据库及数据恢复
- iOS之深入解析GCD的底层原理
- Python之打造专属Python开发者的完美终端工具Rich
- Codeforces Round #552 (Div. 3) —— B. Make Them Equal