/*最大点权独立集=sum-最小点权覆盖*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 0x3fffffff
#define ll __int64
#define N 3000
struct node
{
ll u,v,w,next;
}bian[N*N*2];
ll ma[N][N],id[N][N],head[N],yong,s,t,dis[N];;
void addedge(ll u,ll v,ll w)
{
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void add(ll u,ll v,ll w)
{
addedge(u,v,w);
addedge(v,u,0);
}
void init()
{
yong=0;
memset(head,-1,sizeof(head));
memset(dis,-1,sizeof(dis));
}
void bfs()
{
ll u,v,i;
queue<ll>q;
q.push(t);
dis[t]=0;
while(!q.empty())
{
u=q.front();
q.pop();
for(i=head[u]; i!=-1; i=bian[i].next)
{
v=bian[i].v;
if(dis[v]==-1)
{
dis[v]=dis[u]+1;
q.push(v);
}
}
}
return ;
}
ll ISAP()
{
ll sum=0;
bfs();
ll gap[N],cur[N],stac[N],top,i;
memset(gap,0,sizeof(gap));
for(i=s; i<=t; i++)
{
gap[dis[i]]++;
cur[i]=head[i];
}
ll k=s;
top=0;
while(dis[s]<t+1)
{
if(k==t)
{
ll minn=inf,index;
for(i=0; i<top; i++)
{
ll e=stac[i];
if(minn>bian[e].w)
{
minn=bian[e].w;
index=i;
}
}
for(i=0; i<top; i++)
{
ll e=stac[i];
bian[e].w-=minn;
bian[e^1].w+=minn;
}
sum+=minn;
top=index;
k=bian[stac[top]].u;
}
for(i=cur[k]; i!=-1; i=bian[i].next)
{
ll v=bian[i].v;
if(bian[i].w&&dis[k]==dis[v]+1)
{
cur[k]=i;
k=v;
stac[top++]=i;
break;
}
}
if(i==-1)
{
ll m=t+1;
for(i=head[k]; i!=-1; i=bian[i].next)
if(m>dis[bian[i].v]&&bian[i].w)
{
m=dis[bian[i].v];
cur[k]=i;
}
if(--gap[dis[k]]==0)break;
gap[dis[k]=m+1]++;
if(k!=s)
k=bian[stac[--top]].u;
}
}
return sum;
}
int main()
{
ll n,m,i,j,cnt;
ll sum;
while(scanf("%I64d%I64d",&n,&m)!=EOF)
{
init();
cnt=1;
sum=0;s=0;t=n*m+1;
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
scanf("%I64d",&ma[i][j]);
id[i][j]=cnt++;
sum+=ma[i][j];
}
for(i=1; i<=n; i++)
for(j=1; j<=m; j++)
{
if((i+j)&1)
{
add(s,id[i][j],ma[i][j]);
if(i<=n-1)
add(id[i][j],id[i+1][j],inf);
if(j<=m-1)
add(id[i][j],id[i][j+1],inf);
if(i>=2)
add(id[i][j],id[i-1][j],inf);
if(j>=2)
add(id[i][j],id[i][j-1],inf);
}
else
add(id[i][j],t,ma[i][j]);
}
printf("%I64d\n",sum-ISAP());
}
return 0;
}

hdu 1569 最大权独立集的更多相关文章

  1. hdu 1565&&hdu 1569 (最大点权独立集)

    题目意思很明确就是选一些没有相连的数字,使和最大,建成二分图后求最大点权独立集,, #include<stdio.h> #include<string.h> const int ...

  2. HDU 1569 方格取数(2)(最大流最小割の最大权独立集)

    Description 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大.   ...

  3. hdu 1565&hdu 1569(网络流--最小点权值覆盖)

    方格取数(1) Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Su ...

  4. CF1404E Bricks (最大权独立集)

    考虑把答案进行转化,通过分矩形条,我们能去掉一些夹在#之间的边 那么答案= #个数 - 能去掉的边个数 但去掉是有限制的,同一个#格子的横边和竖边不能同时去掉 把边转化成点,限制变成边. 横竖边的点 ...

  5. HDU 1569 - 方格取数(2) - [最大点权独立集与最小点权覆盖集]

    嗯,这是关于最大点权独立集与最小点权覆盖集的姿势,很简单对吧,然后开始看题. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1569 Time Limi ...

  6. HDU 1569 方格取数(2)

    方格取数(2) Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 15 ...

  7. Assignment (HDU 2853 最大权匹配KM)

    Assignment Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  8. hdu 3061 hdu 3996 最大权闭合图 最后一斩

    hdu 3061 Battle :一看就是明显的最大权闭合图了,水提......SB题也不说边数多少....因为开始时候数组开小了,WA....后来一气之下,开到100W,A了.. hdu3996. ...

  9. HDU 1565 最大点权独立集

    首先要明白图论的几个定义: 点覆盖.最小点覆盖: 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是“点” 覆盖了所有“边”.. 最小点覆盖(minimum vertex covering ...

随机推荐

  1. bzoj2242 [SDOI2011]计算器——BSGS

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2242 第一次写BSGS,参考了好多好多博客: 然而看到的讲解和模板是一种写法,这道题的网上题 ...

  2. bzoj1121[POI2008]激光发射器SZK(结论)

    1121: [POI2008]激光发射器SZK Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 916  Solved: 759[Submit][Sta ...

  3. 9.9 NOIP模拟题

    9.9 NOIP模拟题 T1 两个圆的面积求并 /* 计算圆的面积并 多个圆要用辛普森积分解决 这里只有两个,模拟计算就好 两圆相交时,面积并等于中间两个扇形面积减去两个三角形面积 余弦定理求角度,算 ...

  4. 自定义滚动条配合鼠标滚轮demo

    <!DOCTYPE html> <html> <head> <title></title> <meta charset="u ...

  5. js 获取URL的值

    今天碰到要在一个页面获取另外一个页面url传过来的参数,一开始很本能的想到了用 split("?")这样一步步的分解出需要的参数. 后来想了一下,肯定会有更加简单的方法的!所以在网 ...

  6. SQLYog 快捷键

    SQLYog常用快捷键 Ctrl+M     创建一个新的连接Ctrl+N     使用当前设置新建连接Ctrl+F4    断开当前连接 对象浏览器F5         刷新对象浏览器(默认)Ctr ...

  7. 普通平衡树代码。。。Treap

    应一些人之邀...发一篇代码 #include <iostream> #include <cstdio> #include <cstdlib> #include & ...

  8. 【转】Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

    概要  前面,我们已经学习了ArrayList,并了解了fail-fast机制.这一章我们接着学习List的实现类——LinkedList.和学习ArrayList一样,接下来呢,我们先对Linked ...

  9. 【转】Java 集合系列01之 总体框架

    Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.*Java集合主要可以划分为4个部分:List列表.Set集合 ...

  10. (转)44 道 JavaScript 难题

    JavaScript Puzzlers原文 1. ["1", "2", "3"].map(parseInt)   答案:[1, NaN, N ...