要选出一些点,这些点之间没有相邻边且要求权值之和最大,求这个权值
分析:二分图带权最大独立集.
用最大流最小割定理求解.其建图思路是:将所有格点编号,奇数视作X部,偶数视作Y部,建立源点S和汇点T, S向X部的点建边,Y部向T建边,容量为该点权值.
相邻的一对点(肯定是一奇一偶),由X中的点向Y中的点建边,容量为正无穷.
最后跑出最大流,|带权最大独立集| = |点权之和| - |最小割| = |点权之和| - |最大流|

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<algorithm>
#include<string>
using namespace std;
const int INF = 0x3f3f3f3f;
const int MAXN=3010;//点数的最大值
const int MAXM=400010;//边数的最大值
#define captype intstruct SAP_MaxFlow{struct Edge{int from,to,next;captype cap;}edges[MAXM];int tot,head[MAXN];int gap[MAXN];int dis[MAXN];int cur[MAXN];int pre[MAXN];void init(){tot=0;memset(head,-1,sizeof(head));}void AddEdge(int u,int v,captype c,captype rc=0){edges[tot] = (Edge){u,v,head[u],c};  head[u]=tot++;edges[tot] = (Edge){v,u,head[v],rc}; head[v]=tot++;}captype maxFlow_sap(int sNode,int eNode, int n){//n是包括源点和汇点的总点个数,这个一定要注意memset(gap,0,sizeof(gap));memset(dis,0,sizeof(dis));memcpy(cur,head,sizeof(head));pre[sNode] = -1;gap[0]=n;captype ans=0;int u=sNode;while(dis[sNode]<n){if(u==eNode){captype Min=INF ;int inser;for(int i=pre[u]; i!=-1; i=pre[edges[i^1].to])if(Min>edges[i].cap){Min=edges[i].cap;inser=i;}for(int i=pre[u]; i!=-1; i=pre[edges[i^1].to]){edges[i].cap-=Min;edges[i^1].cap+=Min;}ans+=Min;u=edges[inser^1].to;continue;}bool flag = false;int v;for(int i=cur[u]; i!=-1; i=edges[i].next){v=edges[i].to;if(edges[i].cap>0 && dis[u]==dis[v]+1){flag=true;cur[u]=pre[v]=i;break;}}if(flag){u=v;continue;}int Mind= n;for(int i=head[u]; i!=-1; i=edges[i].next)if(edges[i].cap>0 && Mind>dis[edges[i].to]){Mind=dis[edges[i].to];cur[u]=i;}gap[dis[u]]--;if(gap[dis[u]]==0) return ans;dis[u]=Mind+1;gap[dis[u]]++;if(u!=sNode) u=edges[pre[u]^1].to;  //退一条边}return ans;}
}F;int G[55][55];
int dir[4][2] = {1,0,-1,0,0,1,0,-1};int main()
{#ifndef ONLINE_JUDGEfreopen("in.txt","r",stdin);freopen("out.txt","w",stdout);#endifint N,M;int u,v,tmp;while(scanf("%d %d",&N, &M)==2){int S = 0,T = N*M+1;int sum  =0;F.init();for(int i=1;i<=N;++i){for(int j=1;j<=M;++j){scanf("%d",&tmp);G[i][j] = tmp;sum+=tmp;}}for(int i=1;i<=N;++i){for(int j=1;j<=M;++j){int id = (i-1)*M +j;if((i+j)&1){F.AddEdge(S,id,G[i][j]);for(int k=0;k<4;++k){int nx = i+ dir[k][0];int ny = j+ dir[k][1];if(nx<1 || nx>N || ny<1 ||ny>M) continue;int nid = (nx-1)*M + ny;F.AddEdge(id,nid,INF);}}else{F.AddEdge((i-1)*M+j,T,G[i][j]);}}}int flow = F.maxFlow_sap(S,T,T+1);int res = sum - flow;printf("%d\n",res);}return 0;
}

转载于:https://www.cnblogs.com/xiuwenli/p/9682796.html

hdu 1569 1565 (二分图带权最大独立集 - 最小割应用)相关推荐

  1. HDU1569 方格取数(2)(二分图带权最大独立集 - 最小割应用)

    题目链接 结论 ∣带权最大独立集∣=∣点权之和∣−∣最小割∣=∣点权之和∣−∣最大流∣|带权最大独立集| = |点权之和| - |最小割| = |点权之和| - |最大流|∣带权最大独立集∣=∣点权之 ...

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

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

  3. 二分图带权匹配、最佳匹配与KM算法

    ---------------------以上转自ByVoid神牛博客,并有所省略.   [二分图带权匹配与最佳匹配] 什么是二分图的带权匹配?二分图的带权匹配就是求出一个匹配集合,使得集合中边的权值 ...

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

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

  5. [BZOJ2162]男生女生(二分图带权独立集+dp)

    题意:懒得写了,比较麻烦. 强行嵌套的题真没意思.. 开始我看见数据范围n=50,第一问求什么完全子图,我以为是个搜索减枝,然后第二问那个dp我想了想,列了几个方程发现不是很对,然后又没有部分分,我就 ...

  6. Destroying The Graph 最小点权集--最小割--最大流

    Destroying The Graph 构图思路: 1.将所有顶点v拆成两个点, v1,v2 2.源点S与v1连边,容量为 W- 3.v2与汇点连边,容量为 W+ 4.对图中原边( a, b ), ...

  7. 【hdu 4859】海岸线(图论--网络流最小割)

    题意:有一个区域,有'.'的陆地,'D'的深海域,'E'的浅海域.其中浅海域可以填充为陆地.这里的陆地区域不联通,并且整个地图都处在海洋之中.问填充一定浅海域之后所有岛屿的最长的海岸线之和. 解法:最 ...

  8. HDU 3313 Key Vertex 胡搞(网络流最小割拆点什么的人家才不会呢)

    problem大意:给you一个无loop有向graph,求它的key vertex数目.(最近刚过了英语六级,耶,1Y,炫耀~~~~~) 什么是key vertex呢?就是去掉以后从起点到不了终点了 ...

  9. 二分图带权最大匹配费用流_你真的会写二分检索吗?

    作者:liubird来源:http://blog.chinaunix.net/uid-1844931-id-3337784.html 前几天在论坛上看到有统计说有80%的程序员不能够写对简单的二分法. ...

  10. java 二分图带权匹配_算法笔记_139:二分图的最大权匹配(Java)

    packagecom.liuzhen.practice;importjava.util.Scanner;public classMain {public static int MAX = 100;pu ...

最新文章

  1. linux c pid获取进程名 进程名获取pid
  2. python三十二:os模块
  3. 生产者消费者问题Java三种实现
  4. 7个相同小球4个不同盒子_【计算启蒙】4个游戏陪娃玩懂“数拆分”,加减法都不用愁!...
  5. 602B. Approximating a Constant Range
  6. 深入体验php项目开发.pdf,《深入体验PHP项目开发》.(谭贞军).[PDF]
  7. java中412是什么错_HTTP 412 错误 – 先决条件失败 (Precondition failed)
  8. 单片机c语言编程RGB,C语言将raw data(rgb/rgba)写成bmp文件(bmp24或32)
  9. 如何关闭来自苹果的个性化广告?
  10. 求四科平均成绩c语言,c语言实验报告评语大全
  11. js读取服务器xml文件,js读取XML文件 JS读写XML文件
  12. jet-cp4005,linux双面打印,如何使用Linux(Ubuntu 13.04)在HP 7610上启用双面打印
  13. 在字节跳动实习的真实感受究竟如何?
  14. C语言中调用数组元素的三种方法:下标法、数组名法、指针法
  15. 基于net-snmp的代理端及管理端开发手册
  16. 第七届科技节电子设计大赛须知
  17. 兔子吃狼 引发的人力资源故事
  18. JAVA设置代理的两种方式(HTTP和HTTPS)
  19. LocalDate加减操作及比较大小
  20. httpsession mysql,session 的持久化存储

热门文章

  1. MPLS virtual private network OptionB实验(华为设备)
  2. IS-IS GR(优雅重启)过程
  3. IPv6报文格式讲解及其科学性探究
  4. PHP文件流下载内容
  5. HashMap简单源码及多线程下的死循环
  6. Apache - 403错误
  7. Android之notificaction使用
  8. 【原创】昆虫棋离线复盘工具v1.5 更新(BoardSpace.net hive games reviewer)
  9. C#中可以使用正则表达式来过滤html字符
  10. oracle sql 执行计划分析_ORACLE数据库查看执行计划