TZOJ 3665 方格取数(2)(最大点权独立集)
描述
给你一个m*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。
输入
包括多个测试实例,每个测试实例包括2整数m,n和m行n列的非负数(m<=50,n<=50)
输出
对于每个测试实例,输出可能取得的最大的和
样例输入
3 3
75 15 21
75 15 28
34 70 5
样例输出
188
题意
如上
题解
最大点权独立集=总权值-最小点权覆盖
用最小割跑出来的是最小点权覆盖,再用sum-最小点权覆盖
把图黑白染色,黑色点连源点S流量a[i][j],白色点连汇点T流量a[i][j],然后每个相邻的黑白点连黑白边流量INF,跑最小割即可
代码
- #include<bits/stdc++.h>
- using namespace std;
- const int maxn=1e5+;
- const int maxm=2e5+;
- int n,m,S,T;
- int deep[maxn],q[];
- int FIR[maxn],TO[maxm],CAP[maxm],COST[maxm],NEXT[maxm],tote;
- void add(int u,int v,int cap)
- {
- TO[tote]=v;
- CAP[tote]=cap;
- NEXT[tote]=FIR[u];
- FIR[u]=tote++;
- TO[tote]=u;
- CAP[tote]=;
- NEXT[tote]=FIR[v];
- FIR[v]=tote++;
- }
- bool bfs()
- {
- memset(deep,,sizeof deep);
- deep[S]=;q[]=S;
- int head=,tail=;
- while(head!=tail)
- {
- int u=q[++head];
- for(int v=FIR[u];v!=-;v=NEXT[v])
- {
- if(CAP[v]&&!deep[TO[v]])
- {
- deep[TO[v]]=deep[u]+;
- q[++tail]=TO[v];
- }
- }
- }
- return deep[T];
- }
- int dfs(int u,int fl)
- {
- if(u==T)return fl;
- int f=;
- for(int v=FIR[u];v!=-&&fl;v=NEXT[v])
- {
- if(CAP[v]&&deep[TO[v]]==deep[u]+)
- {
- int Min=dfs(TO[v],min(fl,CAP[v]));
- CAP[v]-=Min;CAP[v^]+=Min;
- fl-=Min;f+=Min;
- }
- }
- if(!f)deep[u]=-;
- return f;
- }
- int maxflow()
- {
- int ans=;
- while(bfs())
- ans+=dfs(S,<<);
- return ans;
- }
- void init()
- {
- tote=;
- memset(FIR,-,sizeof FIR);
- }
- int N,M,a[][],color[][],has[][],tot,sum,f;
- int main()
- {
- while(cin>>N>>M)
- {
- init();
- memset(color,,sizeof color);
- tot=sum=;
- for(int i=;i<=N;i++)
- {
- if(i&)f=;
- else f=-;
- for(int j=;j<=M;f*=-,j++)
- {
- scanf("%d",&a[i][j]);
- sum+=a[i][j];
- has[i][j]=tot++;
- color[i][j]=f;
- }
- }
- S=tot,T=S+;
- for(int i=;i<=N;i++)
- for(int j=;j<=M;j++)
- {
- if(color[i][j]==)
- add(S,has[i][j],a[i][j]);
- else
- add(has[i][j],T,a[i][j]);
- if(color[i-][j]==-)add(has[i][j],has[i-][j],<<);
- if(color[i+][j]==-)add(has[i][j],has[i+][j],<<);
- if(color[i][j-]==-)add(has[i][j],has[i][j-],<<);
- if(color[i][j+]==-)add(has[i][j],has[i][j+],<<);
- }
- cout<<sum-maxflow()<<'\n';
- }
- return ;
- }
TZOJ 3665 方格取数(2)(最大点权独立集)的更多相关文章
- HDU 1565 1569 方格取数(最大点权独立集)
HDU 1565 1569 方格取数(最大点权独立集) 题目链接 题意:中文题 思路:最大点权独立集 = 总权值 - 最小割 = 总权值 - 最大流 那么原图周围不能连边,那么就能够分成黑白棋盘.源点 ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- hdu1569 方格取数 求最大点权独立集
题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ...
- hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 两道题只是数据范围不同,都是求的最大点权独立集. 我们可以把下标之和为奇数的分成一个集合,把下标之和为偶数 ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- hdu 4859 最大点权独立集的变形(方格取数的变形)
/*刚开始不会写,最大点权独立集神马都不知道,在潘神的指导下终于做出来,灰常感谢ps: 和方格取数差不多奇偶建图,对于D必割点权为0,对于.必然不割点权为inf.然后和方格取数差不多的建图 .--.| ...
- hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)
转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...
- 【最大点权独立集】【HDU1565】【方格取数】
题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ...
随机推荐
- VirtualBox安装增强工具方法
1.http://blog.csdn.net/wuliowen/article/details/71541561 2.https://segmentfault.com/a/11900000062335 ...
- html _ 提取html片段内的纯文本
var html = “html字符串”;var textstr =html.replace(/<[^>]*>|/g,"");//纯文本
- Net操作Excel_NPOI
Npoi 简介 1.整个Excel表格叫做工作表:WorkBook(工作薄),包含的叫页(工作表):Sheet:行:Row:单元格Cell. 2.Npoi 下载地址:http://npoi.codep ...
- hdoj 1003 学习思路
基本解题思路:动态规划,不考虑穷举,分治. 根据网上,状态转移方程是:MaxSum[i] = Max{ MaxSum[i-1] + A[i], A[i]} 翻译公式:到当前位置i 时,最大子序列和为: ...
- Flex_布局和容器
1.Halo组件也称MX组件,是Flex3的独有组件(按钮.文本字段.容器等).而Flex4引入了新一代的组件,称为Spark. Flex4同时支持Halo和Spark.但是很多Halo组件都有更 ...
- centos6.9出现openvpn:error=certificate signature failure的处理
原因: 将原来openwrt上用的证书复制到centos 6.9后,客户端都连不上了,查了服务器log,出现是error=certificate signature failure错误. 处理方法见帖 ...
- Oracle数据库中的数据出错的解决办法
http://www.jcwcn.com/article/database/oracle/ 今天上班犯了一个严重的错误:把我们系统所使用的Oracle数据库中的数据给改掉了!当发现自己改错时,顿时冒了 ...
- linux目录结构详解(以suse linux 10为例)
一.文件系统结构 位于Linux系统的最顶端即根目录是/.Linux的文件系统的入口就是/,所有的目录.文件.设备都在/之下,/就是Linux文件系统的组织者,也是最上级的领导者. 它之下的子目录有: ...
- C++ 将数据转为字符串的几种方法
收集一下: 1\将int 转为 LPCTSTR 其实LPCTSTR可以直接使用CString直接代替,无需类型强制转换 CString str; ; //str="15" str. ...
- EF 踩过的坑
ef + mysql-8.0.12-winx64 这个版本的mysql,当一个类为树型结构,会迁移报错. 数据迁移提示:No connection string named 'TaoBaoEntiti ...