转载:http://blog.csdn.net/cold__v__moon/article/details/7924269
/*
这道题和方格取数2相似,是在方格取数2的基础上的变形。 方格取数2解法:
由题意知对于每一个方格,有选与不选,显然是二分的最大独立集,先求最小点权覆盖(它的补集恰好
是最大点权独立集),对于任何一条可行流 s->u->v->t, 在求最大流或最小割的时候,在这3条边中
至少选一条,将u->v设为inf,u->v就不可能存在于最小割中,就只是2选1,如果s->u或v->t选为最小割
则表示u或v(u和v可同时被选)属于最小点权覆盖,所以最小割=最小点权覆盖,再求补集就是最大点权独立集。 这道题的变形:
先考虑的答案的补集(类似最小点权覆盖,但不是),和方格取数不同的是可以去相邻的格子但是要减去2*(G[i][j]&G[a][b]);
所以对于答案的补集就是加上2*(G[i][j]&G[a][b]),对于任何一条可行流 s->u->v->t, 当u->v为2*(G[i][j]&G[a][b]),就可以
表示同时选取u,v的情况,对于答案的必选点s->u就是不存在割的s->u为inf;
推荐学习胡伯涛《最小割模型在信息学竞赛中的应用》,其中对最小割的模型应用讲的很清楚
*/
#include <iostream>
#include <memory.h>
#include <stdio.h>
using namespace std;
const int maxn=55;
const int maxm=maxn*maxn;
const int inf=0x3fffffff;
int G[maxn][maxn];
bool f[maxn][maxn];
int head[maxm],dis[maxm],gap[maxm],cur[maxm],e,pre[maxm];
int dir[4][2]={0,1,0,-1,1,0,-1,0};
int source,sink;
struct
{
int t,next,w;
}edge[maxm*6];
void add(int a,int b,int c)
{
//printf("%d->%d %d\n",a,b,c);
edge[e].t=b;
edge[e].w=c;
edge[e].next=head[a];
head[a]=e++;
edge[e].t=a;
edge[e].w=0;
edge[e].next=head[b];
head[b]=e++;
}
int sap(int ncnt)
{
memset(dis,0,sizeof(dis));
memset(gap,0,sizeof(gap));
for(int i=0;i<=ncnt;i++)
cur[i]=head[i];
int u=pre[source]=source,maxflow=0,aug=inf;
gap[0]=ncnt;
//P();
while(dis[source]<ncnt)
{
loop: for(int &i=cur[u];i!=-1;i=edge[i].next)
{
//P();
int v=edge[i].t;
if(edge[i].w&&dis[u]==dis[v]+1)
{
aug=min(aug,edge[i].w);
pre[v]=u;
//printf("%d-> %d\n",u,v);
u=v;
if(v==sink)
{
maxflow+=aug;
for(u=pre[u];v!=source;v=u,u=pre[u])
{
edge[cur[u]].w-=aug;
edge[cur[u]^1].w+=aug;
//printf("d");
}
aug=inf;
}
goto loop;
}
}
int mindis=ncnt;
//P();
for(int i=head[u];i!=-1;i=edge[i].next)
{
int v=edge[i].t;
if(edge[i].w&&mindis>dis[v])
{
//printf("s");
cur[u]=i;
mindis=dis[v];
}
} if(--gap[dis[u]]==0)
break;
gap[dis[u]=mindis+1]++;
u=pre[u]; } return maxflow;
}
int main()
{
int n,m,a,b,sum,k;
while(~scanf("%d%d%d",&n,&m,&k))
{
sum=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
scanf("%d",&G[i][j]);
sum+=G[i][j];
}
memset(f,false,sizeof(f));
for(int i=0;i<k;i++)
{
scanf("%d%d",&a,&b);
a--;
b--;
f[a][b]=true;
}
memset(head,-1,sizeof(head));
e=0;
source=n*m;
sink=n*m+1;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
if((i+j)%2==1)
{
add(source,i*m+j,f[i][j]?inf:G[i][j]);
for(int k=0;k<4;k++)
{
a=i+dir[k][0];
b=j+dir[k][1];
if(a>=0&&a<n&&b>=0&&b<m)
add(i*m+j,a*m+b,(G[i][j]&G[a][b])<<1);
}
}
else add(i*m+j,sink,f[i][j]?inf:G[i][j]);
printf("%d\n",sum-sap(n*m+2)); } return 0;
}

hdu 3657 最大点权独立集变形(方格取数的变形最小割,对于最小割建图很好的题)的更多相关文章

  1. hdu 3657最大点权独立集变形(方格取数变形)

    /* 分奇偶为二部图,s与奇建图,t与偶建图,权值为当前数的值,如果遇到必取的权值置为inf. 奇偶建边为相邻的权值为2*(x&y):所有数的值-最小点全覆盖. 置为inf意为不能割掉.奇偶边 ...

  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. 洛谷 - P2774 - 方格取数问题 - 二分图最大独立点集 - 最小割

    https://www.luogu.org/problemnew/show/P2774 把两个相邻的节点连边,这些边就是要方便最小割割断其他边存在的,容量无穷. 这种类似的问题的话,把二分图的一部分( ...

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

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

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

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

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

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

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

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

随机推荐

  1. 洛谷P2303 [SDOi2012]Longge的问题

    题目背景 SDOi2012 题目描述 Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需要求出∑gcd(i, N)(1<=i <=N). ...

  2. nginx搭建基于http协议的视频点播服务器

    1,于由自己的服务器上已经安装好nginx(具体安装方法见我的另一篇文章,Linux中安装nginx),所以不再安装. 2,下载nginx_mod_h264_streaming-2.2.7.tar.g ...

  3. [App Store Connect帮助]三、管理 App 和版本(1)添加 App 至您的帐户

    在向 App Store Connect 上传您 App 的构建版本之前,您必须先在您的 App Store Connect 帐户内新建一个 App. 如果您想将 iOS App 和 Apple TV ...

  4. akka设计模式系列-Chain模式

    链式调用在很多框架和系统中经常存在,算不得上是我自己总结的设计模式,此处只是简单介绍在Akka中的两种实现方式.我在这边博客中简化了链式调用的场景,简化后也更符合Akka的设计哲学. trait Ch ...

  5. SCOI2014总结

    似乎还没有写过SCOI的总结,今天补上,权当填坑. PS:CDQZ的看到了不要到处黑 SCOI-2014应该算是我的小高考,感觉拿住一本招的瓶颈就在这里.加之NOIp只有400分有点拖后腿,所以很早就 ...

  6. DataFrame入门案例(集团公司对人事信息处理场景)

    我用一个集团公司对人事信息处理场景的简单案例,来作为入门,详细分析DataFrame上的各种常用操作,包括集团子公司的职工人事信息的合并,职工的部门相关信息查询.职工信息的统计.关联职工与部门信息的统 ...

  7. 笨拙而诡异的 Oracle

    有这样一段 SQL 代码: 通过 C# 获取查询结果:    SQL 代码中有两个参数,且都是字符串类型,以上的 C# 代码是生成 Oracle SQL 代码所需要的参数.运行结果如下:   居然发生 ...

  8. [ USACO 2018 OPEN ] Out of Sorts (Gold)

    \(\\\) \(Description\) 运行以下代码对一长为\(N\)的数列\(A\)排序,不保证数列元素互异: cnt = 0 sorted = false while (not sorted ...

  9. fcc html5 css 练习2

    <form action="/submit-cat-photo" >action属性的值指定了表单提交到服务器的地址 <input type="text ...

  10. viewpager无线轮播获取网络图片

    首先创建小圆点 小圆点的两个属性一共两个属性另一个跟这个一个样,只不过颜色能让我们区分的 <?xml version="1.0" encoding="utf-8&q ...