转载:http://yzmduncan.iteye.com/blog/1149057    
二分图最小点覆盖和最大独立集都可以转化为最大匹配求解。在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为:二分图最小点权覆盖和二分图最大点权独立集。二分图最小点权覆盖从x或者y集合中选取一些点,使这些点覆盖所有的边,并且选出来的点的权值尽可能小。
建模:原二分图中的边(u,v)替换为容量为INF的有向边(u,v),设立源点s和汇点t,将s和x集合中的点相连,容量为该点的权值;将y中的点同t相连,容量为该点的权值。在新图上求最大流,最大流量即为最小点权覆盖的权值和。二分图最大点权独立集在二分图中找到权值和最大的点集,使得它们之间两两没有边。其实它是最小点权覆盖的对偶问题。答案=总权值-最小点覆盖集。具体证明参考胡波涛的论文。例:HDU1569
题意:一个m*n的棋盘,每个格子都有一个权值,从中取出某些数,使得任意两个数所在的格子没有公共边,并且所取去出的数和最大。求这个最大的值。
解:将格子染色成二分图,显然是求二分图的最大点权独立集。将问题转化为二分图最小点权覆盖来求解,最终结果=总权和-最大流。
/*
最大点权独立集:
转化为最小点权覆盖问题,最大点权独立集=总权值-最小点权覆盖集
最小点权覆盖:
设立源点s和t,s连边到点i,容量为i点的权值;点j连边到t,容量为j点权值;原二分图中的边容量为INF,求最大流即为最小点权覆盖。
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int INF = 0x7fffffff;
const int maxv = 2600;
const int maxe = 1000000;
int n,m;
int g[55][55];
struct Edge
{int v;int next;int flow;
};
Edge e[maxe];
int head[maxv],edgeNum;
int now[maxv],d[maxv],vh[maxv],pre[maxv],preh[maxv];
int start,end;void addEdge(int a,int b,int c)
{e[edgeNum].v = b;e[edgeNum].flow = c;e[edgeNum].next = head[a];head[a] = edgeNum++;e[edgeNum].v = a;e[edgeNum].flow = 0;e[edgeNum].next = head[b];head[b] = edgeNum++;
}void Init()
{edgeNum = 0;memset(head,-1,sizeof(head));memset(d,0,sizeof(d));
}int sap(int s,int t,int n)       //源点,汇点,结点总数
{int i,x,y;int f,ans = 0;for(i = 0; i < n; i++)now[i] = head[i];vh[0] = n;x = s;while(d[s] < n){for(i = now[x]; i != -1; i = e[i].next)if(e[i].flow > 0 && d[y=e[i].v] + 1 == d[x])break;if(i != -1){now[x] = preh[y] = i;pre[y] = x;if((x=y) == t){for(f = INF,i=t; i != s; i = pre[i])if(e[preh[i]].flow < f)f = e[preh[i]].flow;ans += f;do{e[preh[x]].flow -= f;e[preh[x]^1].flow += f;x = pre[x];}while(x!=s);}}else{if(!--vh[d[x]])break;d[x] = n;for(i=now[x]=head[x]; i != -1; i = e[i].next){if(e[i].flow > 0 && d[x] > d[e[i].v] + 1){now[x] = i;d[x] = d[e[i].v] + 1;}}++vh[d[x]];if(x != s)x = pre[x];}}return ans;
}void build()
{int i,j;for(i = 1; i <= m; i++){for(j = 1; j <= n; j++){int t = (i-1)*n+j;if((i+j)%2){addEdge(start,t,g[i][j]);if(i>1)addEdge(t,t-n,INF);if(i<m)addEdge(t,t+n,INF);if(j>1)addEdge(t,t-1,INF);if(j<n)addEdge(t,t+1,INF);}elseaddEdge(t,end,g[i][j]);}}
}int main()
{int i,j;int result;while(scanf("%d %d",&m,&n) != EOF){result = 0;Init();for(i = 1; i <= m; i++){for(j = 1; j <= n; j++){scanf("%d",&g[i][j]);result += g[i][j];}}start = 0;end = n*m + 1;build();printf("%d\n",result-sap(start,end,end+1));}return 0;
}

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

网络流之最小点权覆盖和最大点权独立集学习相关推荐

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

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

  2. PAT 1003 Emergency(最短路(迪杰斯特拉||贝尔曼)最小边权下的最大点权)

    1003. Emergency (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue As an emerg ...

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

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

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

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

  5. Hlg 1407 【最小点权覆盖】.cpp

    题意: 给出一个图 该图的每个格子上有值 当扫射一行或一列的时候 格子上的值非0的就-1 输入: 给出n m 表示该图为n*m的图 接下来n*m的图写上格子的值 输出: 最少扫射几次可以使所有点权变成 ...

  6. HDU 1569 最大点权独立集

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

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

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

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

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

  9. poj2125最小点权覆盖

    最小点权覆盖 转化为 最小割 然后网络流. 之前有道和这个差不多的题,伞兵.不过还是做不出来,又对着书拍的.现在好像懂了怎么建图了. s-u-v-t若不被割开则存在 u-v 没被取到. 还是拆点,拆成 ...

最新文章

  1. web浏览器_如何在iPhone和iPad上更改默认的Web浏览器
  2. React子组件给父组件传值, 父组件引用子组件并给子组件传值
  3. 浅谈k8s cni 插件
  4. linux线程堆分配,如何在Linux中的相同进程下为线程分配堆栈或内存
  5. java中map可以为空吗_Java: Map里面的键和值可以为空吗?
  6. 对POST提交数据限制的解决方案
  7. Android中shape的解析
  8. guava 集合转换_Guava的Collections2:过滤和转换Java集合
  9. Team Foundation Server 2010 安装、部署与配置(七):创建 Team Project 时的一个 Issue:TF218027 .
  10. centos8 安装nvidia 显卡驱动(一路踩坑一路填)
  11. LockSupport实现线程通信
  12. h264码流文件通过计算first_mb_in_slice区分帧边界
  13. python对一串列表计数然后画扇形图_python – 按行分组的DataFrame列的高效计数
  14. 【扩频通信】基于matlab直接序列扩频通信【含Matlab源码 1004期】
  15. 黑群晖二合一已损毁_黑群晖二合一ghost安装教程(蜜獾超存可用)
  16. ipod nano7安装linux,奔泪求助ipod nano5怎么取消外放功能
  17. 遇见未来 | 对话朱贤文,PostgreSQL是一匹即将发力的黑马
  18. WINDOWS10突然无法识别U盘(设备和驱动器中不显示)的解决方法
  19. 《区块链技术与应用》学习笔记10——ETH数据结构
  20. 企业上云的动力是什么

热门文章

  1. python应用程序实例_python中一个非常简单的异步应用程序
  2. linux内核添加模块,linux中添加内核模块
  3. Java转码amr_java amr格式转mp3格式(完美解决Linux下转换0K问题)
  4. spring boot面试_Spring Boot面试问题
  5. jquery prev_jQuery next()同级,jQuery prev()
  6. photorec_如何在Linux / Ubuntu中使用PhotoRec恢复已删除的文件
  7. kernel oops_Java中的OOPS概念– OOPS概念示例
  8. 产品运营:当你和上级发生争执你会怎么处理?
  9. 《编写高质量代码:改善Python程序的91个建议》读后感
  10. shell 模拟多进程(3)