【网络流24题】No.9 方格取数问题 (二分图点权最大独立集)
【题意】
在一个有 m*n 个方格的棋盘中, 每个方格中有一个正整数。 现要从方格中取数, 使任意 2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。
输入文件示例
input.txt
3 3
1 2 3
3 2 3
2 3 1输出文件示例
output.txt
11
【分析】
方格的行列之和的奇偶构成二分图,转化成二分图点权最大独立集。
相邻的建边。
假设所有点都能取,
st->u 流量w[u] u的行列和为偶数
v->ed 流量为w[v] v的行列和为奇数
u,v相邻 u->v 流量为INF 表示若u->v 相邻,必定要去掉一个(即割掉与源点或汇点的一条边)
就是最小割。
用sum-最小割即为答案。
二分图点权最大独立集是很经典的模型。
傻逼的我还没看出来二分图以为会算重复,真是。。。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<cmath>
using namespace std;
#define Maxn 1010
#define INF 0xfffffff struct node
{
int x,y,f,o,next;
}t[Maxn*];int len;
int first[Maxn]; int mymin(int x,int y) {return x<y?x:y;}
int mymax(int x,int y) {return x>y?x:y;} void ins(int x,int y,int f)
{
t[++len].x=x;t[len].y=y;t[len].f=f;
t[len].next=first[x];first[x]=len;t[len].o=len+;
t[++len].x=y;t[len].y=x;t[len].f=;
t[len].next=first[y];first[y]=len;t[len].o=len-;
} int st,ed;
queue<int > q;
int dis[Maxn];
bool bfs()
{
while(!q.empty()) q.pop();
memset(dis,-,sizeof(dis));
q.push(st);dis[st]=;
while(!q.empty())
{
int x=q.front();
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
int y=t[i].y;
if(dis[y]==-)
{
dis[y]=dis[x]+;
q.push(y);
}
}
q.pop();
}
if(dis[ed]==-) return ;
return ;
} int ffind(int x,int flow)
{
if(x==ed) return flow;
int now=;
for(int i=first[x];i;i=t[i].next) if(t[i].f>)
{
int y=t[i].y;
if(dis[y]==dis[x]+)
{
int a=ffind(y,mymin(flow-now,t[i].f));
t[i].f-=a;
t[t[i].o].f+=a;
now+=a;
}
if(now==flow) break;
}
if(now==) dis[x]=-;
return now;
} void output()
{
for(int i=;i<=len;i+=)
printf("%d->%d %d\n",t[i].x,t[i].y,t[i].f);
} int max_flow()
{
int ans=;
while(bfs())
{
ans+=ffind(st,INF);
}
return ans;
} int bx[]={,,,,-},
by[]={,,,-,}; int main()
{
int n,m,sum=;
scanf("%d%d",&n,&m);
st=n*m+;ed=st+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int x,now=(i-)*m+j;
scanf("%d",&x);
sum+=x;
if((i+j)%==) ins(st,now,x);
else ins(now,ed,x);
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
{
int now=(i-)*m+j;
for(int k=;k<=;k++) if(i+bx[k]>=&&i+bx[k]<=n&&j+by[k]>=&&j+by[k]<=m)
{
int nn=(i+bx[k]-)*m+j+by[k];
if((i+j)%==) ins(now,nn,INF);
else ins(nn,now,INF);
}
}
int x=max_flow();
printf("%d\n",sum-x);
return ;
}

2016-11-04 15:32:42
【网络流24题】No.9 方格取数问题 (二分图点权最大独立集)的更多相关文章
- [网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]
将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向.之后将源点和汇点分别于黑白格子连边, ...
- luogu2774 方格取数问题 二分图最小权点覆盖集
题目大意:在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任意 2 个数所在方格没有公共边,输出这些数之和的最大值. 思路:这种各个点之间互相排斥求最大值的题,往往需要利 ...
- BZOJ 1475 方格取数(二分图最大点权独立集)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- HDU1569 方格取数(2) —— 二分图点带权最大独立集、最小割最大流
题目链接:https://vjudge.net/problem/HDU-1569 方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory L ...
- 洛谷 - P2774 - 方格取数问题 - 二分图最大独立点集 - 最小割
https://www.luogu.org/problemnew/show/P2774 把两个相邻的节点连边,这些边就是要方便最小割割断其他边存在的,容量无穷. 这种类似的问题的话,把二分图的一部分( ...
- 【Luogu】P2774方格取数问题(最大点权独立集)
题目链接 不知道为啥坠大点权独立集的做法跟最大权闭合图差不多? qwq 放个链接 #include<cstdio> #include<cstring> #include< ...
- [luoguP2774] 方格取数问题(最大点权独立集)
传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集. 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集. 现在对网格染色,使得相邻两点颜色不同,之后把两个 ...
- HDU 1565:方格取数(1)(最大点权独立集)***
http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意:中文. 思路:一个棋盘,要使得相邻的点不能同时选,问最大和是多少,这个问题就是最大点权独立集. 可以 ...
随机推荐
- 面试相关的技术问题---java基础
最近在准备秋季校招,将一些常见的技术问题做一个总结!希望对大家有所帮助! 1.面向对象和面向过程的区别是什么? 面向对象是把构成问题的事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描 ...
- sqlite 数据库打开失败
今天在做Android电子词典的时候,数据库打不开,报错为:Could not open the database in read/write mode. 后来才发现犯了一个低级错误,没有设置权限. ...
- c语言学习之基础知识点介绍(十六):文件操作
一.文件的分类 1.文本文件:打开之后能看得懂的文件 2.二进制文件:打开之后看不懂,类似乱码之类的文件(视频,音频打开之后,能看.听,是应为电脑中装有播放器,播放器中含有解码器). 二.操作文件的步 ...
- com.sun.org.apache.commons.logging.LogConfigurationException: java.lang.NullPointerException
在日志中, 查看导入的包是否是 import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory;
- DLL使用总结
最近项目中使用到了DLL,因此就把最近一段时间的学习总结一下,以备不时之需. 一.相关概念 1.动态链接库 自从微软推出第一个版本的Windows操作系统以来,动态链接库(DLL)一直是Windows ...
- 如何使用SC命令添加删除服务
1.如何删除服务 cmd然后再输入 sc delete "服务名称" 后,回车,双引号必须为英文符号. 2.添加服务 sc create ServiceName binPath= ...
- /etc/sysconfig/目录详解
/etc/sysconfig/目录包括了在红帽企业LINUX下各种系统配置文件,以下是在/etc/sysconfig/目录下的文件列表如图: 500)this.width=500;"> ...
- ASP.NET页面生命周期总结(2)
HttpAplicationFactory获取一个HttpApplication对象: 内部:1.如果是第一次请求过来,那么就把global文件编译成一个类型.(后续请求来的,就可以直接获取这个类型) ...
- job还是job
declare jobno binary_integer;rm_days number;rm_hour number; --传入的hourmy_hour number; --取出当前时间的ho ...
- iOS开发——短信验证码
作为iOS开发者,大家都应该知道ShareSDK这个比较出名的第三方分享(带统计功能)开发工具包. 他的官网今年年初发布了短信验证码的SDK.本文介绍它的短信验证码SDK.(部分过程参考官网如何集成的 ...