[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、天然的二分图:方格。当一个东西有两个元素时,可考虑二分图或网络流(源点汇点各一方嘛)

【codevs1907】【方格取数3】二分图最大带权独立集的更多相关文章

  1. HDU1569 方格取数(2) —— 二分图点带权最大独立集、最小割最大流

    题目链接:https://vjudge.net/problem/HDU-1569 方格取数(2) Time Limit: 10000/5000 MS (Java/Others)    Memory L ...

  2. codevs1907 方格取数 3

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

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

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

  4. BZOJ 1475 方格取数(二分图最大点权独立集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...

  5. 洛谷 - P2774 - 方格取数问题 - 二分图最大独立点集 - 最小割

    https://www.luogu.org/problemnew/show/P2774 把两个相邻的节点连边,这些边就是要方便最小割割断其他边存在的,容量无穷. 这种类似的问题的话,把二分图的一部分( ...

  6. 【codevs1907】方格取数3(最大流最小割定理)

    网址:http://codevs.cn/problem/1907/ 题意:在一个矩阵里选不相邻的若干个数,使这些数的和最大. 我们可以把它看成一个最小割,答案就是矩阵中的所有数-最小割.先把矩阵按国际 ...

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

    ●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为“技术”不佳,搞了一上午) ●09方格取数问题(codevs1907  方格取数3) 想了半天,也没成功建好图: 无奈下 ...

  8. Luogu_2774 方格取数问题

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

  9. HDU1565 方格取数(1) —— 状压DP or 插头DP(轮廓线更新) or 二分图点带权最大独立集(最小割最大流)

    题目链接:https://vjudge.net/problem/HDU-1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory L ...

随机推荐

  1. Appium与python自动测试环境及demo详解

    App--UI自动化这种高端的名词已经被越来越多的人所高呼,可是从实际角度来讲,个人觉得还是有点鸡肋,不如接口自动化敏捷度高,工作量 也是接口自动化的好几倍.但是,[划重点了]  在技术时代中,作为测 ...

  2. Linux利用OneinStack搭建环境

    OneinStack官方网站:https://oneinstack.com 介绍 OneinStack支持以下数种环境组合: LNMP(Linux + Nginx+ MySQL+ PHP) LAMP( ...

  3. BZOJ 1208 [HNOI2004]宠物收养所 | SPlay模板题

    题目: 洛谷也能评 题解: 记录一下当前树维护是宠物还是人,用Splay维护插入和删除. 对于任何一次询问操作都求一下value的前驱和后继(这里前驱和后继是可以和value相等的),比较哪个差值绝对 ...

  4. chrome性能指标(TTFB,TTSR,TTDC,TTFL)

    1.TTFB (Time To First Byte) 是最初的网络请求被发起到从服务器接收到第一个字节这段时间,它包含了 TCP连接时间,发送HTTP请求时间和获得响应消息第一个字节的时间. 注意: ...

  5. 圆盘自动机 cell

    圆盘自动机 cell 一个n-m圆盘自动机,包含n个排列成一圈的方格,它们按1至n编号.每个方格中有一个整数,范围[0,m-1] .圆盘会进行d操作,每次d操作会使得每个方格中的数同时变换,变换为与其 ...

  6. bzoj2178:圆的面积并

    题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2178 sol  :是谁.......是谁往题里下毒...... 辛普森积分,每次判断左边+右边 ...

  7. Codeforces Round #516 (Div. 2)D. Labyrinth

    D. Labyrinth 题目链接:https://codeforces.com/contest/1064/problem/D 题意: 给出一个n*m的矩阵以及人物的起点,并且给出x,y,分别代表这个 ...

  8. 转:CentOS 6.5 nginx

    CentOS 6.5安装及简单配置Nginx 一.准备事项 (1) 因为nginx需要访问80端口所以请先关闭或者开放防火墙端口,和selinux. 参考命令 关闭防火墙: [root@local ~ ...

  9. tcp nio 远程主机强迫关闭了一个现有的连接

    import java.io.IOException; import java.net.InetSocketAddress; import java.net.ServerSocket; import ...

  10. 自以为是而已,不知道它是什么 window.onload 放执行

    var $=jQuery=function(onload){window.onload=onload();} jQuery(function(){alert(2);}); $(function(){a ...