HDU1569+最大点权集
/*
最大点权独立集=总权值-最小点权覆盖集
最大点权独立集=最大流
最小点权覆盖集=最小割 题意:
给你一个m*n的格子的棋盘,每个格子里面有一个非负数。
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大。
根据奇偶建立二分图,
if(i+j)%2==0 源点和该点连接,权值为该点的点权,
if(i+j)%2==1 该点和汇点连接,权值为该点的点权,
之后若i+j为偶数的点和i+j为奇数的点之间相邻,那么就连一条从为偶数的点到为奇数的点的边,权值为无穷大
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<math.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = ;
const int maxm = ;
const int dx[]={,-,,};
const int dy[]={,,,-};
struct Node{
int u,v,next,val;
}edge[ maxm ];
int head[ maxn ],cnt;
void init(){
cnt = ;
memset( head,-,sizeof( head ) );
}
void addedge( int a,int b,int c ){
edge[ cnt ].u = a;
edge[ cnt ].v = b;
edge[ cnt ].val = c;
edge[ cnt ].next = head[ a ];
head[ a ] = cnt++; edge[ cnt ].u = b;
edge[ cnt ].v = a;
edge[ cnt ].val = ;
edge[ cnt ].next = head[ b ];
head[ b ] = cnt++;
} int queue[ maxn ];
int lev[ maxn ];
int Dinic( int start,int end ){
int max_flow = ;
while( true ){
int Head,Tail,id;
Head = Tail = ;
queue[ Tail++ ] = start;
memset( lev,-,sizeof( lev ) );
lev[ start ] = ;
while( Head<Tail ){
id = head[ queue[ Head++ ] ];
while( id!=- ){
if( edge[ id ].val>&&lev[edge[id].v]==- ){
lev[edge[id].v] = lev[edge[id].u]+;
queue[Tail++] = edge[id].v;
if( edge[id].v==end ){
Head = Tail;
break;//分层完成
}
}
id = edge[id].next;
}
}//bfs构造层次网络 if( lev[end]==- ) break; id = start;
Tail = ;
//这里queue被当作stack来用
while( true ){//层次网络中进行dfs
if( id==end ){//dfs找到汇点
int flow = inf;
int flag = -;
for( int i=;i<Tail;i++ ){
if( edge[queue[i]].val<flow ){
flow = edge[queue[i]].val;
flag = i;
}
}//寻找最小的边
for( int i=;i<Tail;i++ ){
edge[ queue[i] ].val -= flow;
edge[ queue[i]^ ].val += flow;
}
if( flag!=- )
{
max_flow += flow;
Tail = flag;
id = edge[ queue[flag] ].u;
}
else
return inf;
}
id = head[ id ];
while( id!=- ){
if( edge[id].val>&&(lev[edge[id].u]+==lev[edge[id].v]) ){
break;
}
id = edge[id].next;
}
if( id!=- ){
queue[Tail++] = id;
id = edge[id].v;
}
else{
if( Tail== ) break;
lev[ edge[queue[Tail-]].v ] = -;
id = edge[queue[--Tail]].u;
}
}
}
return max_flow;
}
int main(){
int m,n;
while( scanf("%d%d",&n,&m)!=EOF ){
init();
int sum = ;
int temp;
for( int i=;i<=n;i++ ){
for( int j=;j<=m;j++ ){
scanf("%d",&temp);
if( (i+j)%== ){
addedge( ,(i-)*m+j,temp );
}
else{
addedge( (i-)*m+j,n*m+,temp );
}
sum += temp;
}
}
for( int i=;i<=n;i++ ){
for( int j=;j<=m;j++ ){
if( (i+j)%== ){
for( int k=;k<;k++ ){
int tx = i+dx[k];
int ty = j+dy[k];
if( tx>=&&tx<=n&&ty>=&&ty<=m ){
addedge( (i-)*m+j,(tx-)*m+ty,inf );
}
}
}
}
}
int start = ;
int end = n*m+;
int ans = Dinic( start,end );
//printf("sum = %d,ans = %d\n",sum,ans);
printf("%d\n",sum-ans);
}
return ;
}
HDU1569+最大点权集的更多相关文章
- hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)
/** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...
- hdu1565+hdu1569(最大点权独立集)
传送门:hdu1565 方格取数(1) 传送门:hdu1569 方格取数(2) 定理:1. 最小点权覆盖集=最小割=最大流2. 最大点权独立集=总权-最小点权覆盖集 步骤: 1. 先染色,取一个点染白 ...
- HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]
嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...
- 最小点权覆盖集&最大点权独立集
最小点权覆盖集 二分图最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源 ...
- hdu1569 方格取数 求最大点权独立集
题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ...
- HDU1569 最大流(最大点权独立集)
方格取数(2) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Subm ...
- HDU 1565 最大点权独立集
首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...
- zoj 3165 (最小割,最大点权独立集)
胡伯涛的<最小割模型在信息学竞赛中的应用>写的真牛. 这道题是选择一些男孩和女孩参加party,邀请的男孩女孩之间不能有 8g,图就是个明显的二分图,就是选择一些点之间没有8g关系,就是二 ...
- LibreOJ #6007. 「网络流 24 题」方格取数 最小割 最大点权独立集 最大流
#6007. 「网络流 24 题」方格取数 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 ...
随机推荐
- (转)如何把exe的flash还原成swf
首先要准备一个16进制字节码编辑器,这里用的是UltraEdit,可以到这里下载它最新的破解版.现在我们开始我们的还原工作吧.1.用UltraEdit打开待还原的exe文件.你就会看到这个exe的字节 ...
- Contoso 大学 - 3 - 排序、过滤及分页
原文 Contoso 大学 - 3 - 排序.过滤及分页 目录 Contoso 大学 - 使用 EF Code First 创建 MVC 应用 原文地址:http://www.asp.net/mvc/ ...
- iMAC——查看开机关机时间
每次下班都记不好早上几点打的卡,你是不是也经常有这样的情况: 那就用以下的代码考到Mac电脑的终端中,回车: mac终端输入上面命令行 查看开机时间: last | grep reboot 查看关机 ...
- 关于百度编辑器UEditor(1.4.3)在C#.NET中的应用实例
首先去百度UEditor官网下载 1.4.3 .net版本 http://ueditor.baidu.com/build/build_down.php?n=ueditor&v=1_4_3-ut ...
- (转)Spark安装与学习
摘要:Spark是继Hadoop之后的新一代大数据分布式处理框架,由UC Berkeley的Matei Zaharia主导开发.我只能说是神一样的人物造就的神器,详情请猛击http://www.spa ...
- C++ 的隱式型別轉換
先上一段代碼, 這段代碼竟然可以編譯過,我的老天! class Boo { Boo(int c){ cout << "I'm Boo"; } }; void do_so ...
- lex&yacc2
YACC: 每个归约后yacc 都执行默认动作,在运行任何明确的动作代码之前,将值$1 赋介$$. 下面是从这个语法中生成的 y.tab.h:#define NAME 257#define NUMBE ...
- 分享一个难得的YiBo微博客户端应用源码Android版
今天给大家分享一款,YiBo微博客户端应用源码,这是一款专为Android用户打造的聚合型微博客户端,完美支持新浪微博.腾讯微博.搜狐微博.网易微博和饭否五个微博平台,界面清爽,使用简单轻巧,支持多账 ...
- URL学习笔记
不多说,先上代码,代码的注释写的已经挺详细的了 //URL:统一资源定位符,一个URL的对象,对应着互联网上的一个资源. //我们可以通过URL的对象调用其相应的方法,将此资源读取(即所谓的“下载”) ...
- 利用mysqld_multi启动管理多实例
利用mysqld_multi启动管理多实例 官方管理多实例的一个脚本peer #将之前的目录清空 [root@mysql01 mysql]# tree /data/mysql/ /data/mysql ...