/*
分奇偶为二部图,s与奇建图,t与偶建图,权值为当前数的值,如果遇到必取的权值置为inf。
奇偶建边为相邻的权值为2*(x&y);所有数的值-最小点全覆盖。
置为inf意为不能割掉。奇偶边权意为可以割掉相邻的。
*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
#define inf 0x3fffffff
#define N 2600
#define ii 60
struct node {
int u,v,w,next;
}bian[N*4*2];
int head[N],yong,s,t,dis[N],ma[ii][ii],id[ii][ii],f[ii][ii];;
void init(){
yong=0;
memset(head,-1,sizeof(head));
memset(dis,-1,sizeof(dis));
}
void addedge(int u,int v,int w) {
bian[yong].u=u;
bian[yong].v=v;
bian[yong].w=w;
bian[yong].next=head[u];
head[u]=yong++;
}
void add(int u,int v,int w) {
addedge(u,v,w);
addedge(v,u,0);
}
void bfs() {
int u,v,i;
queue<int>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 ;
}
int ISAP() {
int sum=0;
bfs();
int 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];
}
int k=s;
top=0;
while(dis[s]<t+1) {
if(k==t) {
int minn=inf,index;
for(i=0;i<top;i++) {
int e=stac[i];
if(minn>bian[e].w) {
minn=bian[e].w;
index=i;
}
}
for(i=0;i<top;i++) {
int 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) {
int 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) {
int 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() {
int n,m,i,j,k,sum,cnt;
while(scanf("%d%d%d",&n,&m,&k)!=EOF) {
init();
sum=0;
cnt=1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) {
scanf("%d",&ma[i][j]);
sum+=ma[i][j];
id[i][j]=cnt++;
}
memset(f,0,sizeof(f));
while(k--) {
scanf("%d%d",&i,&j);
f[i][j]=1;
}
s=0;
t=n*m+1;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++) {
if((i+j)&1) {
if(f[i][j])
add(s,id[i][j],inf);
else
add(s,id[i][j],ma[i][j]);
if(i>=2)
add(id[i][j],id[i-1][j],2*(ma[i][j]&ma[i-1][j]));
if(j>=2)
add(id[i][j],id[i][j-1],2*(ma[i][j]&ma[i][j-1]));
if(i<=n-1)
add(id[i][j],id[i+1][j],2*(ma[i][j]&ma[i+1][j]));
if(j<=m-1)
add(id[i][j],id[i][j+1],2*(ma[i][j]&ma[i][j+1]));
}
else {
if(f[i][j])add(id[i][j],t,inf);
else add(id[i][j],t,ma[i][j]);
}
}
printf("%d\n",sum-ISAP());
}
return 0;
}

hdu 3657最大点权独立集变形(方格取数变形)的更多相关文章

  1. hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)

    转载:http://blog.csdn.net/cold__v__moon/article/details/7924269 /* 这道题和方格取数2相似,是在方格取数2的基础上的变形. 方格取数2解法 ...

  2. hdu 4859 最大点权独立集的变形(方格取数的变形)

    /*刚开始不会写,最大点权独立集神马都不知道,在潘神的指导下终于做出来,灰常感谢ps: 和方格取数差不多奇偶建图,对于D必割点权为0,对于.必然不割点权为inf.然后和方格取数差不多的建图 .--.| ...

  3. HDU 1565 最大点权独立集

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

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

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

  5. hdu1569 方格取数(2) 最大点权独立集=总权和-最小点权覆盖集 (最小点权覆盖集=最小割=最大流)

    /** 转自:http://blog.csdn.net/u011498819/article/details/20772147 题目:hdu1569 方格取数(2) 链接:https://vjudge ...

  6. hdu1569 方格取数 求最大点权独立集

    题意:一个方格n*m,取出一些点,要求两两不相邻,求最大和.思路:建图,相邻的点有一条边,则建立了一个二分图,求最大点权独立集(所取点两两无公共边,权值和最大),问题转化为求总权和-最小点权覆盖集(点 ...

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

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

  8. HDU 1565 1569 方格取数(最大点权独立集)

    HDU 1565 1569 方格取数(最大点权独立集) 题目链接 题意:中文题 思路:最大点权独立集 = 总权值 - 最小割 = 总权值 - 最大流 那么原图周围不能连边,那么就能够分成黑白棋盘.源点 ...

  9. HDU 1565 方格取数(1)(最大点权独立集)

    http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...

随机推荐

  1. openstack instance resize

    Error: No valid host was found. No valid host found for resize

  2. codevs1225八数码难题(搜索·)

    1225 八数码难题  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description Yours和zero在研究A*启 ...

  3. [Swift通天遁地]九、拔剑吧-(8)创建气泡式页面切换效果

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  4. Akka源码分析-Actor创建(续)

    在上一遍博客中,我们已经分析了actor创建的大致过程,但只是涉及到了Dipatcher/Mailbox/ActorCell/InternalActorRef等对象的创建,并没有介绍我们自定义的继承A ...

  5. 拼接html 的事件转义

    attach += "<div style='line-height: 10px;float: left;margin-left: 10px;' id='attach_" + ...

  6. Effective C++ 深入理解inline

    Effective C++ 深入理解inline inline语义 inline本义是将所调用函数用自身的函数本体替换之,免受函数调用所招致的额外开销,比宏还要不易出错:但是实际上inline的受编译 ...

  7. $P1596 [USACO10OCT]湖计数Lake Counting$

    \(problem\) 其实这题吧\(DFS\)好写一点(大雾 所以就不讲\(DFS\)了 em \(BFS\)的话 主要是 判重. 方向. 队列.(没了吧 至于位置 用两个队列?还是\(pair\) ...

  8. Linux下MySql数据的导入导出

    1,每天4点备份mysql数据: 2,为节省空间,删除超过3个月的所有备份数据: 3,删除超过7天的备份数据,保留3个月里的 10号 20号 30号的备份数据: mysqldump -u用戶名 -p密 ...

  9. 精美对UI设计界面赏析

    最美的UI设计界面赏析 . 喜欢就关注我吧

  10. Hive扩展功能(五)--HiveServer2服务高可用

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...