[ HOJ 2713]Matrix1[网络流] 最大点权独立集问题
题目大意: 一个 N*M 的网格,每个单元都有一块价值 Cij 的宝石。问最多能取多少价值的宝石且任意两块宝石不相邻。(1 <= N, M <= 50, 0 <= Cij <= 40000)
建图方法:
先对网格进行黑白染色,
然后所有黑点到S有一条容量为Cij的边,
白点到T有一条容量为Cij的边,
黑点和相邻的白点有一条容量为INF的边.
最后答案就是 所有的Cij之和减去最小割
自己的理解:每一条边如果流满相当于放弃这一种宝石,并且所以最小割保证放弃的价值最少。
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
using namespace std;
const int N=,INF=;
int gi(){
int str=;char ch=getchar();
while(ch>'' || ch<'')ch=getchar();
while(ch>='' && ch<='')str=str*+ch-,ch=getchar();
return str;
}
int head[N],num=;
struct Lin{
int next,to,dis;
}a[N*];
void init(int x,int y,int z){
a[++num].next=head[x];
a[num].to=y;
a[num].dis=z;
head[x]=num;
a[++num].next=head[y];
a[num].to=x;
a[num].dis=;
head[y]=num;
}
int val[][],id[][],ids=,S=,T,ans=;
int mx[]={,,,-},my[]={,-,,};
int q[N],dep[N];
bool bfs()
{
memset(dep,,sizeof(dep));
int x,u,t=,sum=;
q[]=S;dep[S]=;
while(t!=sum)
{
x=q[++t];
for(int i=head[x];i;i=a[i].next){
u=a[i].to;
if(dep[u]||a[i].dis<=)continue;
dep[u]=dep[x]+;q[++sum]=u;
}
}
return dep[T];
}
int dfs(int x,int flow)
{
if(x==T || !flow)return flow;
int u,tmp,sum=;
for(int i=head[x];i;i=a[i].next){
u=a[i].to;
if(dep[u]!=dep[x]+ || a[i].dis<=)continue;
tmp=dfs(u,min(flow,a[i].dis));
a[i].dis-=tmp;a[i^].dis+=tmp;
sum+=tmp;flow-=tmp;
if(!flow)break;
}
return sum;
}
int maxflow(){
int tot=,tmp;
while(bfs()){
tmp=dfs(S,INF);
while(tmp)tot+=tmp,tmp=dfs(S,INF);
}
return tot;
}
void work()
{
int n=gi(),m=gi(),flag,xx,yy;
T=n*m+;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
val[i][j]=gi();id[i][j]=++ids;ans+=val[i][j];
}
for(int i=;i<=n;i++)
for(int j=;j<=m;j++){
flag=((i+j)&);
if(flag)init(S,id[i][j],val[i][j]);
else init(id[i][j],T,val[i][j]);
if(!flag)continue;
for(int k=;k<;k++){
xx=i+mx[k];yy=j+my[k];
if(xx>n || xx< || yy>m || yy<)continue;
init(id[i][j],id[xx][yy],INF);
}
}
printf("%d\n",ans-maxflow());
}
void Clear(){
memset(head,,sizeof(head));
num=;ids=;ans=;
}
int main()
{
int TT=gi();
while(TT--){
work();
Clear();
}
}
[ HOJ 2713]Matrix1[网络流] 最大点权独立集问题的更多相关文章
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
		#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ... 
- 【最大点权独立集】【HDU1565】【方格取数】
		题目大意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大. 初看: 没想法 ... 
- hdu1569 方格取数  求最大点权独立集
		题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ... 
- 【BZOJ-1952】城市规划 [坑题]       仙人掌DP + 最大点权独立集(改)
		1952: [Sdoi2010]城市规划 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 73 Solved: 23[Submit][Status][ ... 
- HDU 1565 最大点权独立集
		首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ... 
- SCU3185 Black and white(二分图最大点权独立集)
		题目大概说有几个黑色.白色矩阵,问能选出黑白不相交的矩形面积和的最大值. 建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这 ... 
- zoj 3165 (最小割,最大点权独立集)
		胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ... 
- hdu 1565&&hdu 1569 (最大点权独立集)
		题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ... 
- hdu1565+hdu1569(最大点权独立集)
		传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ... 
随机推荐
- 开启Linux的share
			1.挂载Install Vmare Tool 2.解压VMwareTools.tar.gz 3.安装share目录 4.shared Folders Enabled 添加共享的目录. 在自己的Unb ... 
- Python upper()方法
			描述 Python upper() 方法将字符串中的小写字母转为大写字母. 语法 upper()方法语法: str.upper() 参数 NA. 返回值 返回小写字母转为大写字母的字符串. 实例 以下 ... 
- IOS UITextView自适应高度
			LOFTER app需要实现了一个类似iPhone短信输入框的功能,它的功能其实蛮简单,就是:[UITextView的高度随着内容高度的变化而变化].实现思路应该是: 在UITextView的text ... 
- Flask 蓝图(Blueprint)
			蓝图使用起来就像应用当中的子应用一样,可以有自己的模板,静态目录,有自己的视图函数和URL规则,蓝图之间互相不影响.但是它们又属于应用中,可以共享应用的配置.对于大型应用来说,我们可以通过添加蓝图来扩 ... 
- stringify   字符串转化成json方法
			参照原文:http://www.cnblogs.com/damonlan/ http://www.jb51.net/article/29893.htm stringify的作用主要是序列化对象(转化为 ... 
- faster-rcnn 结构杂谈
			faster-rcnn结构图: (只截取了最难理解的部分) 这个网络看似很复杂,但是理解了其中关键的层,就基本可以掌握这个结构了.要看源码!!要看源码!!要看源码 !!重要的事情说三遍. 关键的层: ... 
- 新手入门 git
			Git是目前世界上最先进的分布式版本控制系统 特点:高端大气上档次 什么是版本控制系统 系统自动记录文件改动 方便同事协作管理 不用自己管理一堆类似的文件了,也不需要把文件传来传去.如果想查看某次改动 ... 
- Mongodb中 Documents文档说明
			mongodb使用BSON格式存储数据记录. 如下图: 文档结构 文档有键值对组成, 有以下结构: { field1: value1, field2: value2, ... ... 
- j2ee基础(1)servlet的生命周期
			Servlet的生命周期 Servlet 生命周期规定了 Servlet 如何被加载.实例化.初始化. 处理客户端请求,以及何时结束服务. 该生命周期可以通过 javax.servlet.Servle ... 
- 详解Windows Server 2008 R2下安装Oracle 11g
			本篇文章转载 http://www.it165.net/database/html/201212/3385.html 一.安装前的准备工作: 1. 修改计算机名: 服务器的计算机名称对于登录到Orac ... 
