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

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

【问题分析】

二分图点权最大独立集,转化为最小割模型,从而用最大流解决。

【建模方法】

首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图X集合中顶点,白色格子看做Y集合顶点,建立附加源S汇T。

1、从S向X集合中每个顶点连接一条容量为格子中数值的有向边。
2、从Y集合中每个顶点向T连接一条容量为格子中数值的有向边。
3、相邻黑白格子Xi,Yj之间从Xi向Yj连接一条容量为无穷大的有向边。

求出网络最大流,要求的结果就是所有格子中数值之和减去最大流量。

【建模分析】

这是一个二分图最大点权独立集问题,就是找出图中一些点,使得这些点之间没有边相连,这些点的权值之和最大。独立集与覆盖集是互补的,求最大点权独立集可以转化为求最小点权覆盖集(最小点权支配集)。最小点权覆盖集问题可以转化为最小割问题解决。结论:最大点权独立集 = 所有点权 - 最小点权覆盖集 = 所有点权 - 最小割集 = 所有点权 - 网络最大流。

对于一个网络,除去冗余点(不存在一条ST路径经过的点),每个顶点都在一个从S到T的路径上。割的性质就是不存在从S到T的路径,简单割可以认为割边关联的非ST节点为割点,而在二分图网络流模型中每个点必关联到一个割点(否则一定还有增广路,当前割不成立),所以一个割集对应了一个覆盖集(支配集)。最小点权覆盖集就是最小简单割,求最小简单割的建模方法就是把XY集合之间的变容量设为无穷大,此时的最小割就是最小简单割了。

/* * Problem: 线性规划与网络流24题 #9 方格取数问题* Author: Guo Jiabao* Time: 2009.6.27 19:06* State: Solved* Memo: 网络最大流 二分图点权最大独立集
*/
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
const int MAXL=50,MAXN=50*50,MAXM=MAXN*8,INF=~0U>>1;
const int dx[]={0,0,-1,1},dy[]={-1,1,0,0};
struct edge
{edge *next,*op;int t,c;
}*V[MAXN],*P[MAXN],ES[MAXM],*Stae[MAXN];
int N,M,S,T,C,EC,Ans,Maxflow,Total;
int Lv[MAXN],Stap[MAXN],Map[MAXL][MAXL];
inline void addedge(int a,int b,int c)
{ES[++EC].next = V[a]; V[a]=ES+EC; V[a]->t=b; V[a]->c=c;ES[++EC].next = V[b]; V[b]=ES+EC; V[b]->t=a; V[b]->c=0;V[a]->op = V[b]; V[b]->op = V[a];
}
void init()
{int i,j,k,c;freopen("grid.in","r",stdin);freopen("grid.out","w",stdout);scanf("%d%d",&M,&N);S=0; T=N*M+1;for (i=1;i<=M;i++){for (j=1;j<=N;j++){scanf("%d",&c);Total += c;Map[i][j] = ++C;if ((i+j)%2==0)addedge(S,C,c);elseaddedge(C,T,c);}}for (i=1;i<=M;i++){for (j=1;j<=N;j++){if ((i+j)%2==0){for (k=0;k<4;k++){int x=i+dx[k],y=j+dy[k];if (x>=1 && x<=M && y>=1 && y<=N)addedge(Map[i][j],Map[x][y],INF);}}}}
}
bool Dinic_Label()
{int head,tail,i,j;Stap[head=tail=0]=S;memset(Lv,-1,sizeof(Lv));Lv[S]=0;while (head<=tail){i=Stap[head++];for (edge *e=V[i];e;e=e->next){j=e->t;if (e->c && Lv[j]==-1){Lv[j] = Lv[i]+1;if (j==T)return true;Stap[++tail] = j;}}}return false;
}
void Dinic_Augment()
{int i,j,delta,Stop;for (i=S;i<=T;i++)P[i] = V[i];Stap[Stop=1]=S;while (Stop){i=Stap[Stop];if (i!=T){for (;P[i];P[i]=P[i]->next)if (P[i]->c && Lv[i] + 1 == Lv[j=P[i]->t])break;if (P[i]){Stap[++Stop] = j;Stae[Stop] = P[i];}elseStop--,Lv[i]=-1;}else{delta = INF;for (i=Stop;i>=2;i--)if (Stae[i]->c < delta)delta = Stae[i]->c;Maxflow += delta;for (i=Stop;i>=2;i--){Stae[i]->c -= delta;Stae[i]->op->c += delta;if (Stae[i]->c==0)Stop = i-1;}}}
}
void Dinic()
{while (Dinic_Label())Dinic_Augment();
}
int main()
{init();Dinic();Ans = Total - Maxflow;printf("%d\n",Ans);return 0;
}

 

转载于:https://www.cnblogs.com/Aragaki/p/7554744.html

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

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

相关文章

Nginx 基础 ( 二)

一、HTTP请求 http请求包括客户端请求服务端 以及 服务端响应数据回客户端&#xff0c;如下 请求&#xff1a;包括请求行、请求头部、请求数据 响应&#xff1a;包括状态行、消息报头、响应正文 比如在Linux中curl请求网站获取请求信息和响应信息 curl -v http://www.kugou.com…

《金融行业应用解决方案白皮书》发布,金融自主创新未来可期!

日前&#xff0c;以“聚势赋能 行业共创”为主题的金融行业解决方案发布会在线上举行。麒麟软件发布《金融行业应用解决方案白皮书》&#xff0c;并发起成立“金融机具生态圈俱乐部”&#xff0c;助力金融行业用户高质量发展。金融信息系统曾经被国外厂商垄断金融信息系统作为国…

leetcode53 Maximum Subarray 最大连续子数组

题目要求 Find the contiguous subarray within an array (containing at least one number) which has the largest sum.For example, given the array [-2,1,-3,4,-1,2,1,-5,4], the contiguous subarray [4,-1,2,1] has the largest sum 6.即&#xff1a;寻找数列中的一个子…

黑马程序员-WEB前端与移动开发就业班

Web前端 — IT互联网的“门面”有人的地方就有江湖&#xff0c;有网站的地方就有Web前端&#xff0c;无所不用&#xff0c;互联网大势所在。课程循序渐进&#xff0c;技术小白课快速上手课程结构由浅入深&#xff0c;基础课程讲解充分&#xff0c;了解网页的结构组成、分析页面…

详解go语言的array和slice 【二】

上一篇 详解go语言的array和slice 【一】已经讲解过,array和slice的一些基本用法&#xff0c;使用array和slice时需要注意的地方&#xff0c;特别是slice需要注意的地方比较多。上一篇的最后讲解到创建新的slice时使用第三个索引来限制slice的容量&#xff0c;在操作新slice时…

详解Objective-C的meta-class

2019独角兽企业重金招聘Python工程师标准>>> 比较简单的一篇英文&#xff0c;重点是讲解meta-class。翻译下&#xff0c;加深理解。 原文标题&#xff1a;What is a meta-class in Objective-C? 原文地址&#xff1a;http://www.cocoawithlove.com/2010/01/what-is…

Nginx 模块的使用

Nginx模块的使用,就是在Nginx配置文件中的http、server、location中添加参数&#xff0c;进行多一项或几项处理一、 实现响应内容替换 1、sub_module二、Nginx的请求限制 1、连接频率限制 limit_conn_module 2、请求频率限制 limit_req_module 注: HTTP请求建立在一次…

Question | 网站被黑客扫描撞库该怎么应对防范?

本文来自网易云社区在安全领域向来是先知道如何攻&#xff0c;其次才是防。针对题主的问题&#xff0c;在介绍如何防范网站被黑客扫描撞库之前&#xff0c;先简单介绍一下什么是撞库。撞库是黑客通过收集互联网已泄露的用户和密码信息&#xff0c;生成对于的字典表&#xff0c;…

十倍程序员 | 使用 Source Generator 将 JSON 转换成 C# 类

前言有时候&#xff0c;我们需要将通过 WebAPI 接收 JSON 字符串转换成 C# 代码。Visual Studio 提供了一个功能菜单可以轻松实现&#xff1a;执行完成后&#xff0c;它会将生成的代码放在打开的的代码窗口中。但是&#xff0c;如果有多个 JSON 字符串需要转换&#xff0c;这个…

Delphi对话框初始地址InitialDir

我的电脑&#xff1a;SaveDialog1.InitialDir : ::{20D04FE0-3AEA-1069-A2D8-08002B30309D};// My Computer {20D04FE0-3AEA-1069-A2D8-08002B30309D}// Network Neighborhood {208D2C60-3AEA-1069-A2D7-08002B30309D}// Recycled {645FF040-5081-101B-9F08-00AA002F954E} 另外…

[python] 解决pip install download速度过慢问题 更换豆瓣源

""" python建立pip.ini.py 2016年4月30日 03:35:11 codegay """import osini"""[global] index-url https://pypi.doubanio.com/simple/ [install] trusted-hostpypi.doubanio.com """ pippathos.environ["…

Maven组件通过命令上传本地和私有仓库

安装本地包到本地仓库&#xff1a;mvn install:install-file -DgroupIdcom.xxx -DartifactIdmqtt-server-client -Dversion1.0.1 -Dpackagingjar -DfileE:\__vdt\MVVP\mqtt-server-client-1.0.1.jar -DpomFileE:\__vdt\MVVP\pom.xml安装本地包到私有仓库&#xff1a;mvn deploy…

Nginx -静态资源Web服务

一、静态资源类型 注&#xff1a;非服务器动态生成的文件 1、浏览器端渲染 HTML、css、js 2、图片 jpeg、gif、png 3、视频 flv、MPEG 4、文件 TXT、等任意下载文件二、静态资源服务配置1、配置语法-文件读取 syntax&#xff1a;sendfile on|off default&#xff1a;sendfi…

微软Microsoft Azure 机器学习工作室的案例之Image Classification using DenseNet

点击上方蓝字关注我们&#xff08;本文阅读时间&#xff1a;10分钟)Microsoft Azure Machine Learning Studio是微软强大的机器学习平台&#xff0c;在设计器中&#xff0c;微软内置了15个场景案例&#xff0c;但网上似乎没有对这15个案例深度刨析的分析资料&#xff0c;所以我…

java小基础之instanceof运算符

instanceof主要用来判断一个类是否实现了某个接口&#xff0c;或者判断一个实例对象是否属于一个类。 1. 判断一个对象是否属于一个类 boolean result p instanceof Student; 2. 对象类型强制转换前的判断 Person p new Student(); //判断对象p是否为Student类的实例 if(p in…

音乐分类

代码&#xff1a; 1 import numpy as np2 from scipy import fft3 from scipy.io import wavfile4 from sklearn.linear_model import LogisticRegression5 import random6 """7 使用logistic regression处理音乐数据&#xff0c;音乐数据训练样本的获得是使…

Problem C: 类的初体验(III)

Description 定义一个类Data&#xff0c;只有一个double类型的属性和如下4个方法&#xff1a; 1. 缺省构造函数&#xff0c;将属性初始化为0&#xff0c;并输出“Initialize a data 0”。 2. 带参构造函数&#xff0c;将属性初始化为指定参数&#xff0c;并输出“Initialize…

Nginx- 实现跨域访问

一、什么是跨域 跨域&#xff1a;由于浏览器的同源策略&#xff0c;即属于不同域的页面之间不能相互访问各自的页面内容。详细见下表&#xff1a; 注&#xff1a;同源策略&#xff0c;单说来就是同协议&#xff0c;同域名&#xff0c;同端口 URL说明是否允许通信http://www.a…

不管对不对,先把闹钟关了再说

小榆提前关闭早上闹钟&#xff0c;几乎工作日的早晨都是被这魔怔的铃声给拉扯醒&#xff0c;无论有多么不愿还是痛苦&#xff0c;可对这闹钟也无可奈何&#xff0c;就算一时果断掐掉接下来是另一回麻烦事。最后一天&#xff0c;已经顾不得多少&#xff0c;没什么令人惧怕的人或…

pycharm(windows)安装及其设置中文菜单

pycharm&#xff08;windows&#xff09;安装及其设置中文菜单 1.下载 在官网&#xff08;http://www.jetbrains.com/pycharm/download/#sectionwindows&#xff09;进行下载 或者到百度云进行下载 专业版&#xff1a;链接&#xff1a;http://pan.baidu.com/s/1bSSRds 密码&…