本来想写道水题....结果调了这么久!就是一个 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. Hidden String(深搜)

    Hidden String Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) ...

  2. 柯里化函数之Javascript

    柯里化函数之Javascript 定义 依据定义来说,柯里化就是将一个接收"多个"參数的函数拆分成一个或者很多个接收"单一"參数的函数.定义看起来是比較抽象的. ...

  3. Opencv 学习资料集合(更新中。。。)

    基础学习笔记之opencv(24):imwrite函数的使用 tornadomeet 2012-12-26 16:36 阅读:13258 评论:9 基础学习笔记之opencv(23):OpenCV坐标 ...

  4. 用javap命令反编译来分析字符串问题

    编写Test.java.编译完后生成Test.class文件,然后对该文件运行javap -c Test命令,生成字节码指令.阅读并得出结论 一.s1和s2指向常量池的不同常量 ①java代码 pub ...

  5. 理解SQL SERVER中的分区表

    转自:http://www.cnblogs.com/sienpower/archive/2011/12/31/2308741.html 简介 分区表是在SQL SERVER2005之后的版本引入的特性 ...

  6. gcc代码反汇编查看内存分布[2]: arm-linux-gcc

    arm-none-linux-gnueabi-gcc -v gcc version 4.4.1 (Sourcery G++ Lite 2010q1-202) 重点: 代码中的内存分配, 地址从低到高: ...

  7. PDO获取数据的方法fetch()、fetchAll()、setFetchMode()、bindColumn()

    PDO的数据获取方法与其他数据库扩展都非常类似,只要成功执行SELECT查询,都会有结果集对象产生.不管是使用PDO对象中的query()方法,还是使用prepare()和execute()等方法结合 ...

  8. day4作业

    作业内容:计算器 #!/usr/bin/env python # -*- coding:utf-8 -*- import re,time #加减字符处理函数 def handle_symbol(cal ...

  9. 转: 如何实现jQuery的Ajax文件上传

    [PHP文件上传] 在开始之前,我觉得是有必要把通WEB上传文件的原理简单说一下的.实际上,在这里不管是PHP,JSP,还是ASP处理上传的文件,其实都是WEB早已把文件上传到服务器了,我们只是运用上 ...

  10. 什么是AOI自动光学检测机测试技术

    前言 当印刷电路板的价格以每年六到八个百分点的速度持续滑落,产品的生产良率就成为维持产业竞争力的要素.要获得高的良品率需要有良好的制造控制能力,而要获得良好的制程控制,似乎就必须要在各个制程中执行良好 ...