[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=59001242
向大(hei)佬(e)势力学(di)习(tou)

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

输入描述 Input Description
第1 行有2 个正整数m和n,分别表示棋盘的行数
和列数。接下来的m行,每行有n个正整数,表示棋盘方格中的数。

输出描述 Output Description
将取数的最大总和输出

样例输入 Sample Input
3 3
1 2 3
3 2 3
2 3 1

样例输出 Sample Output
11

数据范围及提示 Data Size & Hint
n,m<=30

最近学图论,精神大餐吃的太饱不消化,就多攻克一下网络流和二分图吧。

这道题其实是最小割的应用,兼有二分图的思想在里面。想想,要使选出来的最大,就要使留下来的最小,而我们刚好有求最小的东西(最大流=最小割)
方格是天然的二分图,可以将方格染成交叉的黑白图,黑的丢一边,白的丢一边,相邻的连边,容量正无穷,表示不能割掉。源点与黑的连边,容量即为格子中的数,白点与汇点连边,同理。割掉的边即为舍弃的格子。

代码(注意点的编号不能重复)

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;const int oo=0x3f3f3f3f;int m,n,a[50][50],sz=0,top;
struct Node{int to,nxt,flow,cap;
}r[6000];
int head[3000],hh=1,dep[3000];
queue<int> q;void adde(int fr,int to,int val){hh++;r[hh].to=to;r[hh].flow=0;r[hh].cap=val;r[hh].nxt=head[fr];head[fr]=hh;hh++;r[hh].to=fr;r[hh].flow=0;r[hh].cap=0;r[hh].nxt=head[to];head[to]=hh;
}
bool bfs(){while(!q.empty()) q.pop();memset(dep,-1,sizeof(dep));q.push(0);dep[0]=0;while(!q.empty()){int u=q.front();q.pop();for(int i=head[u];i;i=r[i].nxt){int v=r[i].to;if(dep[v]==-1&&r[i].cap-r[i].flow>0){dep[v]=dep[u]+1;q.push(v);}}if(u==top) return true;}return false;
}
int dfs(int u,int delta){if(u==top||delta==0) return delta;int rt=0,f;for(int i=head[u];i;i=r[i].nxt){int v=r[i].to;if(dep[v]==dep[u]+1&&r[i].cap-r[i].flow>0){f=dfs(v,min(delta,r[i].cap-r[i].flow));rt+=f;delta-=f;r[i].flow+=f;r[i^1].flow-=f;}if(delta==0) break;}return rt;
}
int main(){top=2500;int tot=0;scanf("%d%d",&m,&n);for(int i=1;i<=m;i++)for(int j=1;j<=n;j++){scanf("%d",&a[i][j]);tot+=a[i][j];if((i+j)%2==0){adde(0,i*50+j,a[i][j]);if(i-1>0) adde(i*50+j,(i-1)*50+j,oo);if(i+1<=m) adde(i*50+j,(i+1)*50+j,oo);if(j-1>0) adde(i*50+j,i*50+j-1,oo);if(j+1<=n) adde(i*50+j,i*50+j+1,oo);}if((i+j)%2!=0){adde(i*50+j,top,a[i][j]);}}int ans=0;while(bfs()){ans+=dfs(0,oo);}printf("%d",tot-ans);return 0;
}

总结:
1、遇到求最值问题,可从最大、最小两个方向出发。
2、转化、建边也是很需要思维的东西
3、天然的二分图:方格。当一个东西有两个元素时,可考虑二分图或网络流(源点汇点各一方嘛)

转载于:https://www.cnblogs.com/LinnBlanc/p/7763157.html

【codevs1907】【方格取数3】二分图最大带权独立集相关推荐

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

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

  2. luogu2774 方格取数问题 二分图最小权点覆盖集

    题目大意:在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,输出这些数之和的最大值. 思路:这种各个点之间互相排斥求最大值的题,往往需要利 ...

  3. HDU1569 方格取数(2)(二分图带权最大独立集 - 最小割应用)

    题目链接 结论 ∣带权最大独立集∣=∣点权之和∣−∣最小割∣=∣点权之和∣−∣最大流∣|带权最大独立集| = |点权之和| - |最小割| = |点权之和| - |最大流|∣带权最大独立集∣=∣点权之 ...

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

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

  5. Luogu_2774 方格取数问题

    Luogu_2774 方格取数问题 二分图最小割 第一次做这种题,对于某些强烈暗示性的条件并没有理解到. 也就是每一立刻理解到是这个图是二分图. 为什么? 横纵坐标为奇数的只会和横纵坐标为偶数的相连. ...

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

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

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

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

  8. XTU 二分图和网络流 练习题 C. 方格取数(1)

    C. 方格取数(1) Time Limit: 5000ms Memory Limit: 32768KB 64-bit integer IO format: %I64d      Java class ...

  9. hdu2167 方格取数 状态压缩dp

    题意:      方格取数,八个方向的限制. 思路:      八个方向的不能用最大流了,四个的可以,八个的不能抽象成二分图,所以目测只能用dp来跑,dp[i][j]表示的是第i行j状态的最优,具体看 ...

  10. [codevs 1907] 方格取数3

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

最新文章

  1. 计算机与网络技术基础试题及答案,计算机与网络技术基础试题及答案(2003年10月)...
  2. python第三方库使用文档_python 的第三方库的使用
  3. C# Enum,Int,String的互相转换
  4. 在《糖豆人》身上,我们看到了竞技游戏火爆的六大因素
  5. 用java来实现验证码功能
  6. 讲100个科学道理,不如做这些有趣的理科实验!
  7. linux 文件大小总和,linux磁盘占用跟每个文件夹大小总和不符?
  8. canvas动画 - 背景线条 - 应用篇
  9. iOS中内存管理的问题——堆和栈
  10. STM32CubeIDE USB Audio声卡 WM8978 + I2S
  11. V2VNet: Vehicle-to-Vehicle Communication for Joint Perception and Prediction
  12. 笔记本锁定计算机怎么解锁,笔记本键盘被锁定了怎么办 笔记本解锁键盘的方法...
  13. 计算机网络每日一题,计算机一级考试每日练习(一)附答案
  14. Linux下安装hadoop的步骤
  15. 机器学习中数据预处理——标准化/归一化方法(scaler)
  16. 完美解决iphone连电脑蓝牙出现bluetooth外围设备无法正确安装
  17. 英文名字大全解释 (详)
  18. ICPC nangchan I. Max answer
  19. 利用spring boot 写一个稳定的爬虫
  20. HAProxy的Websocket负载平衡

热门文章

  1. 利用模态DIV结合UpdateProgress防止页面重复提交
  2. 基于BERT进行商品标题实体识别,很详细~
  3. fastText:极快的文本分类工具
  4. AI相亲,让爱变得简单
  5. 将list中的数据类型都变成int类型
  6. pandas中read_csv的缺失值处理
  7. 一文弄懂nginx反向代理和负载均衡
  8. 产品经理是“通”才还是“专”才
  9. MCU新趋势—Cortex M0/M3/M4 行业应用主题研讨会
  10. Windows系统过滤病毒功能吗