BZOJ 1475 方格取数(二分图最大点权独立集)
【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1475
【题目大意】
给出一个n*n的方格,从中取一些不相邻的数字,使得和最大
【题解】
我们可以根据i+j的奇偶性将点划分为两组,同组之间无连边,因此这是一张二分图
我们建立源点对偶点引点权大小的流量,建立汇点,从每个奇点引点权大小的流量到汇点,
总点权减去该图的最小割就是答案,因为最小割中的边表示了该点被选中去除,
所有去除点和最小,那么剩下的满足限制条件的就一定是最大值了。
【代码】
- #include <cstdio>
- #include <cstring>
- #include <vector>
- #include <queue>
- using namespace std;
- const int INF=0x3f3f3f3f;
- const int MAX_V=1000;
- struct edge{int to,cap,rev;};
- vector<edge> G[MAX_V];
- int level[MAX_V],iter[MAX_V];
- void add_edge(int from,int to,int cap){
- G[from].push_back((edge){to,cap,G[to].size()});
- G[to].push_back((edge){from,0,G[from].size()-1});
- }
- void bfs(int s){
- memset(level,-1,sizeof(level));
- queue<int> que;
- level[s]=0;
- que.push(s);
- while(!que.empty()){
- int v=que.front(); que.pop();
- for(int i=0;i<G[v].size();i++){
- edge &e=G[v][i];
- if(e.cap>0&&level[e.to]<0){
- level[e.to]=level[v]+1;
- que.push(e.to);
- }
- }
- }
- }
- int dfs(int v,int t,int f){
- if(v==t)return f;
- for(int &i=iter[v];i<G[v].size();i++){
- edge &e=G[v][i];
- if(e.cap>0&&level[v]<level[e.to]){
- int d=dfs(e.to,t,min(f,e.cap));
- if(d>0){
- e.cap-=d;
- G[e.to][e.rev].cap+=d;
- return d;
- }
- }
- }return 0;
- }
- int max_flow(int s,int t){
- int flow=0;
- for(;;){
- bfs(s);
- if(level[t]<0)return flow;
- memset(iter,0,sizeof(iter));
- int f;
- while((f=dfs(s,t,INF))>0){
- flow+=f;
- }
- }
- }
- int n,a[30][30];
- void solve(){
- int sum=0,s=n*n,t=n*n+1;
- for(int i=0;i<=t;i++)G[i].clear();
- for(int i=0;i<n;i++)for(int j=0;j<n;j++){
- if((i+j)%2==0){
- if(i+1<n)add_edge(i*n+j,(i+1)*n+j,INF);
- if(j+1<n)add_edge(i*n+j,i*n+j+1,INF);
- if(i>0)add_edge(i*n+j,(i-1)*n+j,INF);
- if(j>0)add_edge(i*n+j,i*n+j-1,INF);
- add_edge(s,i*n+j,a[i][j]);
- }else add_edge(i*n+j,t,a[i][j]);
- sum+=a[i][j];
- }printf("%d\n",sum-max_flow(s,t));
- }
- int main(){
- while(~scanf("%d",&n)){
- for(int i=0;i<n;i++){
- for(int j=0;j<n;j++)scanf("%d",&a[i][j]);
- }solve();
- }return 0;
- }
BZOJ 1475 方格取数(二分图最大点权独立集)的更多相关文章
- HDU 1565 1569 方格取数(最大点权独立集)
HDU 1565 1569 方格取数(最大点权独立集) 题目链接 题意:中文题 思路:最大点权独立集 = 总权值 - 最小割 = 总权值 - 最大流 那么原图周围不能连边,那么就能够分成黑白棋盘.源点 ...
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
- hdu1569 方格取数 求最大点权独立集
题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ...
- TZOJ 3665 方格取数(2)(最大点权独立集)
描述 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. 输入 包括多个测试实例 ...
- hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 两道题只是数据范围不同,都是求的最大点权独立集. 我们可以把下标之和为奇数的分成一个集合,把下标之和为偶数 ...
- BZOJ 1475: 方格取数( 网络流 )
本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 ! 二分图最大点权独立集...黑白染色一下 , 然后建图 : S -> black_node , white_no ...
- [BZOJ 1475] 方格取数
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1475 [算法] 首先将方格黑白染色 , 也就是说 , 如果(i + j)为奇数 , ...
- SCU3185 Black and white(二分图最大点权独立集)
题目大概说有几个黑色.白色矩阵,问能选出黑白不相交的矩形面积和的最大值. 建二分图,黑色矩阵为X部的点,白色为Y部,XY的点权都为其矩阵面积,如果有个黑白矩阵相交则它们之间有一条边,那样问题就是要从这 ...
随机推荐
- hdu 1159 Common Subsequence(最长公共子序列 DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Jav ...
- Yii 1.1.17 六、开启路由与使用缓存
一.开启路由 1.在配置文件main.php的components中 定义如下: // 定义路由 'urlManager'=>array( // URL模式为PATHINFO 'urlForma ...
- JAVA常见的集合类
关系的介绍: Set(集):集合中的元素不按特定方式排序,并且没有重复对象.他的有些实现类能对集合中的对象按特定方式排序. List(列表):集合中的元素按索引位置排序,可以有重复对象,允许按照对象在 ...
- 微信小程序宽高适配
小程序的宽任何机型都是750rpx,但是画布canvas的默认单位是px,可能会出现需要怪异的样式,我们可以用到 wx.getSystemInfoSync().windowWidth和 wx.getS ...
- [New learn]GCD的卡死现象分析研究
https://github.com/xufeng79x/GCDDemo 1.简介 前接[New learn]GCD的基本使用,我们分析了GCD的一般使用方法,其中比较特殊的是在分析到主队列的时候发生 ...
- MySQL的数据库引擎的类型(转)
腾讯后台开发电话面试问到数据库引擎选用的问题,这里补习一下. 本文属于转载,原文链接为:http://www.cnblogs.com/xulb597/archive/2012/05/25/251811 ...
- FineReport——插入行策略
1.空值是默认的选项,即每次插入新行时,格子都是空白的. 2.原值即单元格中原有内容是什么,就复制到新增的格子中,一般适用于单元格是使用公式定义的, 在插入单元格时,公式会保留下来. 3.默认值即通过 ...
- 【Hibernate3.3复习知识点二】 - 配置hibernate环境(annotations)
配置文件hibernate.cfg.xml中引入:<mapping class="com.bjsxt.hibernate.Teacher"/> <hibernat ...
- AC日记——妖梦拼木棒 洛谷 P3799
妖梦拼木棒 思路: 神特么题: 代码: #include <bits/stdc++.h> using namespace std; #define mod 1000000007LL int ...
- Django学习过程中的排错总结
报错一:RuntimeError: You called this URL via POST, but the URL doesn't end in a slash and you have APPE ...