题目描述

 

输入

第一行给出数字N,M代表行列数.N,M均小于等于100 下面N行M列用于描述数字矩阵

输出

输出最多可以拿到多少块宝石

样例输入

2 2
1 2
2 1

样例输出

4
题意就是选取一些点使他们互不相邻且使选取点的点权和最大。我们将网格图黑白染色,将相邻点连边,显然这是个二分图,我们要求的就是二分图的最大独立集。建模时将源点连向黑点,流量为点权;黑点连向与它相邻的白点,流量为$INF$;将白点连向汇点,流量为点权。答案就是总点权和$-$最小割,被割的边所连点就是不选取的点。因为最小割使源汇点不连通,所以所有选取的黑点都不会流向白点,所有选取的白点不会有黑点流过来,即相邻的点不会被同时选取。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<cmath>
using namespace std;
int head[12000];
int next[50000];
int to[50000];
int val[50000];
int d[12000];
int q[12000];
int n,m;
int tot=1;
int ans=0;
int S,T;
int s[200][200];
void add(int x,int y,int v)
{tot++;next[tot]=head[x];head[x]=tot;to[tot]=y;val[tot]=v;tot++;next[tot]=head[y];head[y]=tot;to[tot]=x;val[tot]=0;
}
bool bfs(int S,int T)
{int r=0;int l=0;memset(q,0,sizeof(q));memset(d,-1,sizeof(d));q[r++]=S;d[S]=0;while(l<r){  int now=q[l];for(int i=head[now];i;i=next[i]){if(d[to[i]]==-1&&val[i]!=0){d[to[i]]=d[now]+1;q[r++]=to[i];}}l++;}return d[T]!=-1;
}
int dfs(int x,int flow)
{if(x==T){return flow;}int now_flow;int used=0;for(int i=head[x];i;i=next[i]){if(d[to[i]]==d[x]+1&&val[i]!=0){now_flow=dfs(to[i],min(flow-used,val[i]));val[i]-=now_flow;val[i^1]+=now_flow;used+=now_flow;if(now_flow==flow){return flow;}}}if(used==0){d[x]=-1;}return used;
}
void dinic()
{while(bfs(S,T)==true){ans-=dfs(S,0x3f3f3f);}
}
int main()
{scanf("%d%d",&m,&n);S=n*m+1;T=n*m+2;for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){scanf("%d",&s[i][j]);ans+=s[i][j];if((i+j)%2==0){add(S,n*(i-1)+j,s[i][j]);}else{add(n*(i-1)+j,T,s[i][j]);}}}for(int i=1;i<=m;i++){for(int j=1;j<=n;j++){if((i+j)%2==0){if(i-1>0){add(n*(i-1)+j,n*(i-2)+j,1<<30);}if(j-1>0){add(n*(i-1)+j,n*(i-1)+j-1,1<<30);}if(i+1<=m){add(n*(i-1)+j,n*i+j,1<<30);}if(j+1<=n){add(n*(i-1)+j,n*(i-1)+j+1,1<<30);}}}}dinic();printf("%d",ans);
}

转载于:https://www.cnblogs.com/Khada-Jhin/p/10570906.html

BZOJ1324Exca王者之剑BZOJ1475方格取数——二分图最大独立集相关推荐

  1. [网络流24题][BZOJ1475]方格取数(最小割)

    题目描述 传送门 题解 讲棋盘进行黑白染色,从超级源向所有黑点连边,容量为num:从所有白点向超级汇连边,容量为num:再从所有的黑点向与之相邻的白点连边,容量为INF. 求最小割(最大流)即为答案. ...

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

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

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

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

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

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

  5. BZOJ 1324: Exca王者之剑/BZOJ 1475: 方格取数 最大权独立集 最小割

    1324: Exca王者之剑 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 618  Solved: 310 [Submit][Status][Di ...

  6. 【BZOJ1475】方格取数 [最小割]

    方格取数 Time Limit: 5 Sec  Memory Limit: 64 MB [Submit][Status][Discuss] Description 在一个n*n的方格里,每个格子里都有 ...

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

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

  8. [codevs 1907] 方格取数3

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

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

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

最新文章

  1. 2022-2028年中国油气勘探工程产业研究及前瞻分析报告
  2. 一些权限管理方面的文章
  3. 【Git报错】 ! [rejected] master - master (fetch first)
  4. 查询慢 跑批慢 性能低怎么办? | 润乾高性能计算专家
  5. 手工编译Android程序
  6. 【工作总结】C++ string工具类
  7. 什么是Servlet?
  8. 金融工程相关问题积累与解决
  9. lr分析器的设计与实现_DCGAN原理分析与pytorch实现
  10. 14.12.1类的特殊成员1
  11. IntelliJ IDEA+Maven运行apache-storm的LocalCluster例子
  12. StudioOne5最新版本电音制作软件
  13. 结构体内存对齐(如何计算结构体的大小)
  14. Windows 7 激活时提示“系统保留分区未分配驱动器号!”解决方法
  15. 解锁用户 修改用户登录尝试次数无限
  16. 磁盘的扩展卷和压缩卷显示灰色,无法使用
  17. 成为认知高手,要避免这9个认知思维陷阱!
  18. 过滤器Filter的介绍
  19. 知识图谱基础入门(一)
  20. 计算机思维的结构问题,《计算思维的结构》读书笔记

热门文章

  1. 利用rsync+inotify搭建实时同步系统
  2. Linux curl命令简介
  3. cocos JS 定时器
  4. Hibernate的like用法
  5. HTML5体感游戏《守护拉普达》诞生记
  6. 不能从const char *转换为LPCWSTR --VS经常碰到
  7. Shell编程之通配符
  8. Makingware调用静态块,实现自定义html内容的常用方法(不需要修改模版部分)...
  9. 0day影响 Chrome和 Safari,谷歌不修复
  10. VMware 披露严重0day,影响Workspace One 的多个组件