本来想写道水题....结果调了这么久!就是一个 define 里面少加了个括号 !

二分图最大点权独立集...黑白染色一下 , 然后建图 :

S -> black_node , white_node -> T , 流量都为点权 . 然后 black_node -> white_node ( 两点有公共边 ) , 流量为 +oo , 然后 answer = ∑ w( i ) ( i ∈ V ) - maxflow

-------------------------------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
  
#define rep( i , n ) for( int i = 0 ; i < n ; ++i )
#define clr( x , c ) memset( x , c , sizeof( x ) )
#define id( x , y ) ( ( x ) * n + y + 1 )
  
using namespace std;
  
const int inf = 0x7fffffff;
const int maxn = 1000;
  
struct edge {
int to , cap;
edge *next , *rev;
} E[ maxn << 3 ] , *pt = E , *head[ maxn ];
  
inline void add_edge( int u , int v , int w ) {
pt -> to = v;
pt -> cap = w;
pt -> next = head[ u ];
head[ u ] = pt++;
pt -> to = u;
pt -> cap = 0;
pt -> next = head[ v ];
head[ v ] = pt++;
head[ u ] -> rev = head[ v ];
head[ v ] -> rev = head[ u ];
}
  
int h[ maxn ] , cnt[ maxn ] , S , T , N;
edge *cur[ maxn ] , *p[ maxn ];
  
int maxFlow() {
clr( h , 0 ) , clr( cnt , 0 );
cnt[ 0 ] = N;
rep( i , N ) cur[ i ] = head[ i ];
int flow = 0 , A = inf;
edge* e;
for( int x = S ; h[ S ] < N ; ) {
for( e = cur[ x ] ; e ; e = e -> next ) 
   if( h[ e -> to ] + 1 == h[ x ] && e -> cap ) break;
if( e ) {
A = min( A , e -> cap );
p[ e -> to ] = cur[ x ] = e;
if( ( x = e -> to ) == T ) {
   for( ; x != S ; x = p[ x ] -> rev -> to ) {
   p[ x ] -> cap -= A;
   p[ x ] -> rev -> cap += A;
   }
   flow += A;
   A = inf;
}
} else {
if( ! --cnt[ h[ x ] ] ) break;
h[ x ] = N;
for( e = head[ x ] ; e ; e = e -> next )
   if( e -> cap && h[ e -> to ] + 1 < h[ x ] ) {
    h[ x ] = h[ e -> to ] + 1;
    cur[ x ] = e;
   }
cnt[ h[ x ] ]++;
if( x != S ) x = p[ x ] -> rev -> to;
}
}
return flow;
}
  
int main(){
freopen( "test.in" , "r" , stdin );
clr( head , 0 );
int ans = 0 , n;
cin >> n;
S = 0 , T = n * n + 1 , N = T + 1;
rep( i , n ) 
   rep( j , n ) {
    int w;
    scanf( "%d" , &w );
    ans += w;
    if( ( i + j ) & 1 ) {
       add_edge( S , id( i , j ) , w );
       if( i ) add_edge( id( i , j ) , id( i - 1 , j ) , inf );
       if( j ) add_edge( id( i , j ) , id( i , j - 1 ) , inf );
       if( i + 1 < n ) add_edge( id( i , j ) , id( i + 1 , j ) , inf );
       if( j + 1 < n ) add_edge( id( i , j ) , id( i , j + 1 ) , inf );
    } else
       add_edge( id( i , j ) , T , w );
   }
cout << ans - maxFlow() << "\n";
return 0;

-------------------------------------------------------------------------------------------------

1475: 方格取数

Time Limit: 5 Sec  Memory Limit: 64 MB
Submit: 616  Solved: 323
[Submit][Status][Discuss]

Description

在一个n*n的方格里,每个格子里都有一个正整数。从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大。

Input

第一行一个数n;(n<=30) 接下来n行每行n个数描述一个方阵

Output

仅一个数,即最大和

Sample Input

2
1 2
3 5

Sample Output

6

HINT

Source

BZOJ 1475: 方格取数( 网络流 )的更多相关文章

  1. BZOJ 1475 方格取数(二分图最大点权独立集)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1475 [题目大意] 给出一个n*n的方格,从中取一些不相邻的数字,使得和最大 [题解] ...

  2. [BZOJ 1475] 方格取数

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1475 [算法] 首先将方格黑白染色 , 也就是说 , 如果(i + j)为奇数 , ...

  3. [BZOJ1475]方格取数 网络流 最小割

    1475: 方格取数 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 512[Submit][Status][Discuss] ...

  4. P2774 方格取数(网络流)

    https://www.luogu.com.cn/problem/P2774 在一个有 m×n 个方格的棋盘中,每个方格中有一个正整数. 现要从方格中取数,使任意2个数所在方格没有公共边,且取出的数的 ...

  5. 【bzoj1475】方格取数 网络流最小割

    题目描述 在一个n*n的方格里,每个格子里都有一个正整数.从中取出若干数,使得任意两个取出的数所在格子没有公共边,且取出的数的总和尽量大. 输入 第一行一个数n:(n<=30) 接下来n行每行n ...

  6. bzoj P2045 方格取数加强版【最大费用最大流】

    今天脑子不太清醒,把数据范围看小了一直TTTTLE-- 最大费用最大流,每个格子拆成两个(x,y),(x,y)',(x,y)向(x,y)'连一条费用a[x][y]流量1的边表示选的一次,再连一条费用0 ...

  7. [网络流24题#9] [cogs734] 方格取数 [网络流,最大流最小割]

    将网格分为两部分,方法是黑白染色,即判断(i+j)&1即可,分开后从白色格子向黑色格子连边,每个点需要四条(边界点可能更少),也就是每个格子周围的四个方向.之后将源点和汇点分别于黑白格子连边, ...

  8. LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流

    #6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  9. Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流)

    Libre 6007 「网络流 24 题」方格取数 / Luogu 2774 方格取数问题 (网络流,最大流) Description 在一个有 m*n 个方格的棋盘中,每个方格中有一个正整数.现要从 ...

随机推荐

  1. 定制ToolChain for ARM

    **************************************************************************编写:王卫无,北京讯业互联科技有限公司版本号:V1. ...

  2. ViewFilpper

    package com.example.suneyaenews; import java.util.ArrayList; import java.util.HashMap; import java.u ...

  3. Python之路Day15

    主要内容:WEB框架.Django基础 WEB框架 Web请求流程 -- 原始Web框架 -- 自定义Web框架 -- MVC 和 MTV # Models Views Controllers # 模 ...

  4. vagrant 入门4

    7. 打包 Packaging , 8080 end 2. 打包Project $ vagrant package --vagrantfile Vagrantfile.pkg 8. 打包完成后,在工程 ...

  5. MongoDB入门(1)--安装配置

    第一步:下载安装 首先当然是找到官方网站http://www.mongodb.org/ 进入下载页面 可以看到,当前最新版本是2.4.5,我的电脑是64位的win7,所以要下载第一个(说明一下,第二个 ...

  6. c++继承构造子类调用父类构造函数的问题及关于容器指针的问题及当容器里储存指针时,记得要手动释放

    看下面的一个问题: class Person { private: string name; public: Person(const string& s=""){ nam ...

  7. Excel连接到MySQL,将Excel数据导入MySql,MySQL for Excel,,

    Excel连接到MySQL 即使当今时代我们拥有了类似微软水晶报表之类的强大报表工具和其他一些灵活的客户管 理应用工具,众多企业在分析诸如销售统计和收入信息的时候,微软的Excel依然是最常用的工具. ...

  8. 编译:一个 C 程序的艺术之旅(转载)

    C 程序为什么要编译才能执行?一个 C 程序在变成可执行文件的过程中,为什么要经过预处理.编译.汇编.链接这四道工序?让我们从这段简单的 C 程序开始. 为什么要编译 这并不是一个简单的问题.我们知道 ...

  9. Windbg调试命令详解(2)

    转载注明>>  [作者:张佩][原文:http://blog.csdn.net/blog_index] 2. 符号与源码 符号与源码是调试过程中的重要因素,它们使得枯燥生硬的调试内容更容易 ...

  10. 十:Java之泛型

    [定义] 一.泛型的定义主要有下面两种: 在程序编码中一些包括类型參数的类型,也就是说泛型的參数仅仅能够代表类.不能代表个别对象.(这是当今较常见的定义) 在程序编码中一些包括參数的类.其參数能够代表 ...