codevs 1907 方格取数 3
Description
在一个有m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。
Input
第1 行有2 个正整数m和n,分别表示棋盘的行数和列数。接下来的m行,每行有n个正整数,表示棋盘方格中的数。
Output
对于给定的方格棋盘,按照取数要求编程找出总和最大的数,将取数的最大总和输出。
Sample Input
3 3
1 2 3
3 2 3
2 3 1
Sample Output
11
HINT
n,m<=30
嗯......这道题大概算是自己想出来的第一道网络流的题吧?
虽然想了很久,WA了很多发,但终于A掉了......
网络流的题真是难想(但这一题还是比较简单的),如果不是我已经知道这道题要用网络流做,还不知道要想到什么时候去了......
好了,不扯多了,进正题:
首先,我们发现直接建模的话非常不好搞,体重的条件不好表示......
于是,我们就想,是否可以把我们选完数之后剩下的数给表示出来呢?我们发现这个不难做到。只需将棋盘黑白二染色,把黑点、白点各看成一块,相邻的格子间有边相连,不难发现将黑白两块分开的割的方案就是不选的点的合法方案(脑补一下应该可以搞出来)。所以最小割即是合法方案中选出的点和最大的方案。于是我们可以从源点向所有黑(白)点连一条容量为这个格子里的数的边,从黑(白)点向相邻的点连一条容量为INF的边,再从白(黑)点向汇点连一条容量为当前格子里的数的边,跑一边最大流即可得出不选的点的最小和,用所有数字之和减去它就是答案。
update:其实这就是最大独立集等于总点数减去最大匹配数
下面贴代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #include<cmath> 6 #define maxm 100010 7 #define INF (1<<25) 8 #define r(j) (j^1) 9 10 using namespace std; 11 typedef long long llg; 12 13 int head[101*101],next[maxm],to[maxm],c[maxm],tt=1; 14 int a[101][101],zx[4]={0,0,1,-1},zy[4]={1,-1,0,0}; 15 int d[maxm],l,r,dep[maxm],ans,tut,s,t,n,m; 16 17 int getint(){ 18 int w=0;bool q=0; 19 char c=getchar(); 20 while((c>'9'||c<'0')&&c!='-') c=getchar(); 21 if(c=='-') q=1,c=getchar(); 22 while(c>='0'&&c<='9') w=w*10+c-'0',c=getchar(); 23 return q?-w:w; 24 } 25 26 void link(int x,int y,int z){ 27 to[++tt]=y;next[tt]=head[x];head[x]=tt; 28 to[++tt]=x;next[tt]=head[y];head[y]=tt; 29 c[tt^1]=z; 30 } 31 32 bool bfs(){ 33 for(int i=1;i<=t;i++) dep[i]=0; 34 l=r=0;d[r++]=s;dep[s]=1;int u; 35 while(l!=r){ 36 u=d[l++]; 37 for(int i=head[u];i;i=next[i]) 38 if(!dep[to[i]] && c[i]>0){ 39 dep[to[i]]=dep[u]+1; 40 d[r++]=to[i]; 41 } 42 } 43 return dep[t]>0; 44 } 45 46 int dfs(int u,int low){ 47 int res=0,v; 48 if(u==t) return low; 49 if(!low) return 0; 50 for(int i=head[u];i;i=next[i]) 51 if(c[i]>0 && dep[to[i]]==dep[u]+1){ 52 v=dfs(to[i],min(low-res,c[i])); 53 c[i]-=v;c[r(i)]+=v;res+=v; 54 } 55 return res; 56 } 57 58 int main(){ 59 freopen("a.in","r",stdin); 60 freopen("a.out","w",stdout); 61 n=getint();m=getint();s=n*m+1;t=s+1; 62 for(int i=1;i<=n;i++) 63 for(int j=1;j<=m;j++) 64 a[i][j]=getint(); 65 for(int i=1,now(0);i<=n;i++) 66 for(int j=1;j<=m;j++){ 67 now++; 68 if(!((i+j)&1)){ 69 link(s,now,a[i][j]); 70 for(int k=0,x,y,n1;k<4;k++){ 71 x=i+zx[k];y=j+zy[k]; 72 if(x>0 && x<=n && y>0 && y<=m){ 73 n1=(x-1)*m+y; 74 link(now,n1,INF); 75 } 76 } 77 } 78 else link(now,t,a[i][j]); 79 tut+=a[i][j]; 80 } 81 while(bfs()) 82 while(int tot=dfs(s,INF)) ans+=tot; 83 printf("%d\n",tut-ans); 84 return 0; 85 }
转载于:https://www.cnblogs.com/lcf-2000/p/5551356.html
codevs 1907 方格取数 3相关推荐
- [codevs 1907] 方格取数3
[codevs 1907] 方格取数3 题解: 二分图染色.最大点权独立集. 因为要用到最大独立集的一些思路,故先写了一篇最大独立集的题解:http://blog.csdn.net/qq_211102 ...
- codevs 1907:方格取数3
这个系列终于做完了.. 又是一道网络流 因为不能取相邻的点,很容易发现需要二分图 一半的点连源,另一半连汇,流量为map[i,j] 相邻的点连起来,流量为inf 答案就是总和减最大流 最大流...看这 ...
- [codevs 1227] 方格取数2
[codevs 1227] 方格取数 2 题解: 注:这是CODEVS的方格取数2,走k次的版本. 因为每个格子可以走无数次,但走过一次之后数字就变成了0,也就是只有一次可以加上格子里的数字.所以要拆 ...
- Codevs 1043 方格取数
1043 方格取数 2000年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descriptio ...
- codevs 1227 方格取数 2
Description 给出一个n*n的矩阵,每一格有一个非负整数Aij,(Aij <= 1000)现在从(1,1)出发,可以往右或者往下走,最后到达(n,n),每达到一格,把该格子的数取出来, ...
- codevs 1227 方格取数2
网络流+拆点 π_π(好像HDU上有类似的题..那时我还是用Pascal写的) 算是裸题吧..然而我本不会费用流 看了下黄学长的代码,说下自己的理解(黄学长只贴了代码π_π) 把每一个点拆成两个点,一 ...
- codevs 1043 方格取数 2000年NOIP全国联赛提高组
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 设有N*N的方格图(N<=10,我们将其中的某些方格中填入正整数,而 ...
- 【codevs 1902】方格取数3(最小割)
1907 方格取数 3 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 在一个有m*n 个方格的棋盘中,每个方格中 ...
- 线性规划与网络流24题●09方格取数问题13星际转移问题
●(做codevs1908时,发现测试数据也涵盖了1907,想要一并做了,但因为"技术"不佳,搞了一上午) ●09方格取数问题(codevs1907 方格取数3) 想了半天,也没 ...
最新文章
- Luogu P4336 [SHOI2016]黑暗前的幻想乡(容斥,矩阵树定理,子集反演)
- nodejs - 创建服务器(1)
- 线程与线程池,实例比较。
- SLAM | 使用三维位姿图优化减少单目视觉里程计(3D Visual Odometry)定位轨迹的漂移(附源代码)
- python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归
- 如何利用python语言实现对象数组
- 如何基于protobuf实现一个极简版的RPC(转载)
- C# CommandName四个属性
- 如何成为一个合格的JAVA初级程序员
- 苹果电脑连接打印机操作
- 游戏公司可能碰到哪些知识产权问题?
- 7.1 RAID(独立冗余磁盘阵列)
- java -io字符流FileWrite操作演示
- 中国区GPS偏移纠正(适用于Google地图)
- CTF-RSA1(已知p、q、dp、dq、c)
- [4G5G专题-90]:流程 - 4G LTE 终端在RRC IDLE状态下的行为
- 利用钉钉【上下游组织】搭建企业外部协作平台
- nginx 之postread 阶段:获取真实客户端地址的realip 模块
- 安装electron项目的时候老是报错:Command failed.
- BZOJ 2095: [Poi2010]Bridges 混合图欧拉回路
热门文章
- mysql lepus_MySQL 监控软件lepus天兔
- 柜员计算机技能,新入职柜员必备软件:柜员技能训练系统最新版
- Scude导入MySQL_FM2017_FMF赛季更新和真实修正数据库[更新至9.9,超过89000个更新]
- 用金万维怎么设置路由器_家用路由器怎么设置 家庭路由器设置方法【图文】...
- OJ RuntimeError常见原因
- Windows2008的安装
- JavaScript | 声明数组并在每个循环中使用的代码
- JavaScript | 创建对象并通过JavaScript函数在表中显示其内容
- c语言指针++_C ++此指针| 查找输出程序| 套装3
- tooctalstring_Java Long类toOctalString()方法的示例