转载: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;
}

转载于:https://www.cnblogs.com/thefirstfeeling/p/4410659.html

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

  1. 【网络流24题】I、 方格取数问题(二分图的最大独立集/最小割)

    I. 方格取数问题(二分图的最大独立集/最小割) [问题分析] 二分图点权最大独立集,转化为最小割模型,从而用最大流解决. [建模方法] 首先把棋盘黑白染色,使相邻格子颜色不同,所有黑色格子看做二分图 ...

  2. HDU 1569 最大点权独立集

     最大点权独立集与最小点权覆盖是对偶问题,这里先介绍最小点权覆盖的解法. 最小点权覆盖问题是指,给出一张二分图,二分图的每个节点带有一个点权,要求从中选出若干节点,使得这些节点能够覆盖二分图中所有的 ...

  3. hdu 1569 方格取数(2) 最大点权独立集

    二分图. 最大点权独立集=总权-最小点权覆盖集. 哪位大神能给一些二分图 最大点权独立集等等 的相关资料!!!!!跪谢 用网络流求解最小点权覆盖集即可,建图不讲了. #include<cstdi ...

  4. [网络流][最大点权独立集] 方格取数

    预备知识: 点覆盖集:无向图G的一个点集,使得该图中所有边都至少有一个端点在该集合内. 最小点权覆盖集:在带点权无向图G中,点权之和最小的覆盖集. 点独立集:无向图G的一个点集,使得任两个在该集合中的 ...

  5. [luoguP2774] 方格取数问题(最大点权独立集)

    传送门 引入两个概念: 最小点权覆盖集:满足每一条边的两个端点至少选一个的最小权点集. 最大点权独立集:满足每一条边的两个端点最多选一个的最大权点集. 现在对网格染色,使得相邻两点颜色不同,之后把两个 ...

  6. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  7. 734. [网络流24题] 方格取数问题 二分图点权最大独立集/最小割/最大流

    «问题描述: 在一个有m*n 个方格的棋盘中,每个方格中有一个正整数.现要从方格中取数,使任 意2 个数所在方格没有公共边,且取出的数的总和最大.试设计一个满足要求的取数算法. «编程任务: 对于给定 ...

  8. 最小点权覆盖集最大点权独立集

    最小点权覆盖集 最小点权覆盖集解决的是这样一个问题: 在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和. 方法: 1.先对图二分染色,对于每条边两端点的颜色不同 2.然后建立源点S, ...

  9. BZOJ 1324: Exca王者之剑/BZOJ 1475: 方格取数 最大权独立集 最小割

    1324: Exca王者之剑 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 618  Solved: 310 [Submit][Status][Di ...

最新文章

  1. C语言中的指针和内存泄漏
  2. 图像分割在医学影像学中的应用(一)
  3. Java 中序列化与反序列化
  4. python ioctl_ioctl()函数 Unix/Linux
  5. Cookie的小知识
  6. 我要自学网python视频教程_人生苦短,请用Python!学习Python的四大理由
  7. java-rpc框架
  8. 第二章--电商设计表-商品模块--mysql电商项目设计
  9. 使用OWA无法撰写邮件内容的解决法
  10. 还挺好看!用命令行画思维导图;66天机器学习之旅;斯坦福CS234 强化学习课程;哈佛CS50 计算机科学导论课程;前沿论文 | ShowMeAI资讯日报
  11. 关于MATLAB的saveas函数错误
  12. 腾云忆想技术干货|TSF微服务治理实战系列(三)——服务限流
  13. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412
  14. 2021-10-01
  15. 如何处理在WINDOWS VISTA上安装VS2008时遇到要求安装WINDOWS XP SP2的错误和QQ对战平台安装后不能登录的问题
  16. 表单验证 trigger
  17. 获取id查看详情信息
  18. UVa 109 - SCUD Busters(凸包)
  19. JSP汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程网页设计
  20. 【simulink 三相半波整流电路】

热门文章

  1. AJAX vs FLEX:执行,传送,解析JSON,HTML,XML,AFM格式效率比较.
  2. python时间转绝对秒数_python时间时分秒与秒数的互相转换
  3. Python接口自动化之yaml配置文件
  4. CentOS 7 安装Docker
  5. java系列7:this关键词
  6. Uniswap V3的流通性突破5亿美元,24小时交易量仅次于V2和Sushiswap
  7. 美股期指继续下跌 纳指期货跌1%
  8. SAP License:为什么一些现有成熟客户不愿意上S/4
  9. 内卷化的信贷行业,如何做好信贷风控规则的挖掘
  10. 商城文档、商城原型、全局说明、o2o商城、汽车商城、业务逻辑、商城架构图、流程图、版本规划、需求说明、活动、预约、会员、prd、交互说明、页面说明、显示规则、字段说明、操作规则、数据来源、需求规划