【网络流24题----09】方格取数问题

«问题描述:
在一个有m*n 个方格的棋盘中,每个方格中有一个正整数。现要从方格中取数,使任
意2 个数所在方格没有公共边,且取出的数的总和最大。试设计一个满足要求的取数算法。
«编程任务:
对于给定的方格棋盘,按照取数要求编程找出总和最大的数。
«数据输入:
由文件grid.in提供输入数据。文件第1 行有2 个正整数m和n,分别表示棋盘的行数
和列数。接下来的m行,每行有n个正整数,表示棋盘方格中的数。
«结果输出:
程序运行结束时,将取数的最大总和输出到文件grid.out中。
输入文件示例 输出文件示例
grid.in
3 3
  1 2 3

3 2 3

2 3 1

grid.out

11

 

(1<=N,M<=30)


 

对于棋盘黑白染色构出一张二分图,二分图最大独立集。

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<vector>
  5 #include<cstdlib>
  6 #include<cmath>
  7 #include<cstring>
  8 using namespace std;
  9 #define maxn 910
 10 #define inf 0x7fffffff
 11 #define llg int 
 12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
 13 llg n,m,e[maxn],N,p[10][5],g[50][50],k,tot,se[50][50];
 14 
 15 struct DINIC
 16 {
 17     vector<llg>a[maxn],ba[maxn],val[maxn];
 18     llg dl[maxn],deep[maxn],bj[maxn];
 19 
 20     void insert(llg x,llg y,llg z)
 21     {
 22         a[x].push_back(y),val[x].push_back(z);
 23         a[y].push_back(x),val[y].push_back(0);
 24         ba[x].push_back(a[y].size()-1); ba[y].push_back(a[x].size()-1);
 25     }
 26 
 27     llg dfs(llg x,llg low)
 28     {
 29         llg va=0,inc=0;
 30         if (x==N) return low;
 31         llg w=a[x].size();
 32         for (llg i=0;i<w;i++)
 33             if (deep[x]+1==deep[a[x][i]] && val[x][i]>0 && (va=dfs(a[x][i],min(low,val[x][i]))))
 34             {
 35                 val[x][i]-=va; val[a[x][i]][ba[x][i]]+=va; inc+=va;
 36                 return va;
 37             }
 38         if (!inc) deep[x]=-1;
 39         return 0;
 40     }
 41 
 42     void fencen()
 43     {
 44         llg x,w,v; deep[0]=0;
 45         memset(bj,0,sizeof(bj));
 46         llg head=0,tail=1; dl[1]=0; bj[0]=1;
 47         do
 48         {
 49             x=dl[++head]; w=a[x].size();
 50             for (llg i=0;i<w;i++)
 51             {
 52                 v=a[x][i];
 53                 if (bj[v] || val[x][i]<=0) continue;
 54                 dl[++tail]=v;
 55                 deep[v]=deep[x]+1; bj[v]=1;
 56             }
 57         }while (head!=tail);
 58     }
 59 
 60     llg dinic()
 61     {
 62         llg ans=0;
 63         while (1)
 64         {
 65             fencen();
 66             if (!bj[N]) break;
 67             ans+=dfs(0,inf);
 68         }
 69         return ans;
 70     }
 71 
 72     void oupt()
 73     {
 74         for (llg i=1;i<=k;i++)
 75         {
 76             printf("%d: ",i);
 77             llg w=a[i].size();
 78             for (llg e=0;e<w;e++)
 79             {
 80                 llg v=a[i][e];
 81                 if (v>k && v<N && val[i][e]==0) printf("%d ",v-k); 
 82             }
 83             printf("\n");
 84         }
 85     }
 86 }G;
 87 
 88 llg ma(llg x,llg y) {return x*m-m+y;}
 89 
 90 void init()
 91 {
 92     p[1][1]=1,p[2][1]=-1,p[3][2]=1,p[4][2]=-1;
 93     cin>>n>>m;
 94     N=n*m+1;
 95     for (llg i=1;i<=n;i++)
 96         for (llg j=1;j<=m;j++)
 97             scanf("%d",&g[i][j]),tot+=g[i][j];
 98     for (llg i=1;i<=n;i++)
 99         for (llg j=1;j<=m;j++)
100         {
101             for (llg k=1;k<=4;k++)
102                 {
103                     llg x=i+p[k][1],y=j+p[k][2];
104                     if (x>n || x<1 || y>m || y<1) continue;
105                     se[x][y]=(se[i][j]+1)%2;
106                 }
107         }
108     for (llg i=1;i<=n;i++)
109         for (llg j=1;j<=m;j++)
110             if (se[i][j])
111             {
112                 for (llg k=1;k<=4;k++)
113                 {
114                     llg x=i+p[k][1],y=j+p[k][2];
115                     if (x>n || x<1 || y>m || y<1) continue;
116                     G.insert(ma(i,j),ma(x,y),inf);
117                 }
118                 G.insert(0,ma(i,j),g[i][j]);
119             }
120     for (llg i=1;i<=n;i++)
121         for (llg j=1;j<=m;j++)
122             if (!se[i][j])
123                 G.insert(ma(i,j),N,g[i][j]);
124 }
125 
126 int main()
127 {
128     yyj("grid");
129     init();
130     cout<<tot-G.dinic();
131     return 0;
132 }

 

转载于:https://www.cnblogs.com/Dragon-Light/p/6357781.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417338.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

split 中文 java_Java String[] split() 方法

public class Test {public static void main(String args[]) {String str new String("Welcome-to-Itizixishi");System.out.println("- 分隔符返回值 :" );for (String retval: str.split("-")){System.out.println(retval);}System.out.prin…

C# JScript.Eval使用

using Microsoft.JScript;using Microsoft.JScript.Vsa;VsaEngine ve VsaEngine.CreateEngine();object obj Eval.JScriptEvaluate("(" strIn ")", ve);

做最好的自己——读书笔记

精彩片段 谁都渴望成功&#xff0c;但似乎谁都摸不准成功的脉络&#xff1b;与其裹挟在追逐成功的大军里茫然前行&#xff0c;还不如冷静下来&#xff0c;自己跟自己比上一比。 有一天&#xff0c;这个学生问我&#xff1a;“开复博士&#xff0c;我希望自己能像您一样成功。根…

teleport最新版不支持mysql_QA · tp4a/teleport Wiki · GitHub

常见问题安装部署问题Q&#xff1a;使用MySQL数据库&#xff0c;有时重启teleport服务后工作不正常。A&#xff1a;Teleport内建支持SQLite&#xff0c;因此 /etc/init.d/teleport 启动脚本没有加入对mysqld服务的依赖&#xff0c;导致有时teleport服务先于mysqld服务启动&…

js Ajax跨域访问

-----------------------index.html<html><head><title>JQuery Ajax跨域访问</title><script src"jquery.js" type"text/javascript"></script><script type"text/javascript">$(function () {var oB…

拆分-洛谷P2745 [USACO5.3]窗体面积Window Area

https://www.luogu.org/problem/show?pid2745 本来因为会WA的&#xff0c;结果AC了&#xff0c;啊哈哈哈哈哈哈哈哈哈 因为题目要求我们要把一个个平面有先后关系&#xff0c;那么我们就搞一个队列嘛&#xff0c;每次询问时&#xff0c;不断把平面上升就好了&#xff1b; 但…

java搭建tcp客户端_【Java学习笔记】TCP客户端/服务器端

客户端&#xff1a;import java.net.Socket;import java.net.InetAddress;import java.net.UnknownHostException;import java.io.OutputStream;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;impor…

SQLServer表分区

use Test--1分区函数CREATE PARTITION FUNCTION IDRange(int) AS RANGE LEFT FOR VALUES ( 99999999,199999999, 299999999) USE master--2然后我们需要添加相应的文件组 .我使用的是TestData文件组.ALTER DATABASE Test ADD FILEGROUP [TestData] ALTER DATABASE TestADD FILE…

Oracle集合查询

union&#xff1a;简单的返回查询检索出的所有行&#xff0c;但对重复行只返回一次 union all&#xff1a;返回查询检索的说有行&#xff0c;包括所有重复行 intersect&#xff1a;返回两个查询的共有行&#xff0c;即返回一次重复行 minus&#xff1a;返回第一个查询中去掉第二…

JAVA开发需求分析套路_JAVA并发工具常用设计套路示例代码

了解JAVA并发工具常用设计套路前言在学习JAVA并发工具时&#xff0c;分析JUC下的源码&#xff0c;发现有三个利器&#xff1a;状态、队列、CAS。状态一般是state属性&#xff0c;如AQS源码中的状态&#xff0c;是整个工具的核心&#xff0c;一般操作的执行都要看当前状态是什么…

使用PXE+VNC方式安装CentOS 7

U盘坏了&#xff0c;用个下面的方法安装 安装配置dhcp yum -y install dhcp tftp-server 修改如下&#xff0c;网段改为你自己的网段 vim /etc/dhcp/dhcpd.confsubnet 172.16.1.0 netmask 255.255.255.0 {range 172.16.1.100 172.16.1.200;option subnet-mask 255.255.255.0;de…

Oracle常见错误

///ORA-12520: TNS: 监听程序无法找到需要的服务器类型的可用句柄专用服务器选择了共享连接方式&#xff0c;修改(SERVER SHARED)为(SERVER DEDICATED)///ORA-12096,快照日志问题删除物化视图建的日志表DROP MATERIALIZED VIEW LOG ON [schema.]table;然后重建。///OracleExce…

Oracle DMP 导入导出

导出&#xff1a;运行-->输入cmd-->进入DOS环境-->输入命令&#xff1a;exp 用户名/密码数据库名 filexxx.dmp就可以实现数据库的导出了导入&#xff1a;CREATE USER username IDENTIFIED BY userpass;GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,DRO…

Shell 自定义函数

语法&#xff1a; function fname() { 程序段} 例子&#xff1a; #!/bin/bash## 定义函数,分子除以分母&#xff0c;算利润、占有率等## 参数1&#xff1a;分子## 参数2&#xff1a;分母function divfun() {## 参数判断,需要输入两个参数 if [ $# -ne 2 ];thenecho "Enter…

java kafka 集群消费_kafka集群简单生产者消费者实例

项目描述本项目是个简单的kafka集群简单生产者和消费者实例&#xff0c;生产者能生产消息&#xff0c;消费者能消费消息&#xff0c;这里将消费的消息存入了mysql数据库&#xff0c;适合刚kafka刚入门的朋友借鉴使用&#xff0c;里面的zookeeper集群和kafka集群的地址需要修改为…