最小点权覆盖集

最小点权覆盖集解决的是这样一个问题:
在二分图中,对于每条边,两个端点至少选一个,求所选取的点最小权值和。
方法:
1、先对图二分染色,对于每条边两端点的颜色不同
2、然后建立源点S,向其中一种颜色的点连一条容量为该点权值的边
3、建立汇点T,由另一种颜色的点向T连一条容量为该点权值的边
4、对于二分图中原有的边,改为由与S相连的点连向与T相连的点的一条容量为INF的边
跑一遍最大流,其结果就是最小点权和。
原理:
实际为最小割。建好图后,对整张图求最小割,那么不可能割INF的边,所以每对点中连向源汇点边权最小的边被割断,整体来看,就是对于任意一对端点,都选了一个较小权值,得到我们要的结果。

最大点权独立集

与最小点权覆盖集相似:
在二分图中,对于每条边,两个端点至多选一条边,求所选取的点的最大权值和。
方法:
先求一次最小点权覆盖集,再用总权值减去它,就得到了最大点权独立集。
原理:
在最小点权独立集中,是每对点至少选择了一个的最小方案,反过来,就是每对点至多选择了一个的最大方案。

洛谷P2274 方格取数问题

方格取数问题就是很经典的最大点权独立集问题:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#define LL long long int
using namespace std;
const int maxn=100005,maxm=10000005,INF=2000000000;inline int read(){int out=0,flag=1;char c=getchar();while(c<48||c>57) {if(c=='-') flag=-1;c=getchar();}while(c>=48&&c<=57) {out=out*10+c-48;c=getchar();}return out*flag;
}int head[maxn],nedge=0;
struct EDGE{int to,f,next;
}edge[maxm];inline void build(int a,int b,int w){edge[nedge]=(EDGE){b,w,head[a]};head[a]=nedge++;edge[nedge]=(EDGE){a,0,head[b]};head[b]=nedge++;
}int color[105][105],N,M,S,T,X[4]={0,0,-1,1},Y[4]={1,-1,0,0};bool vis[maxn];
int d[maxn],cur[maxn];bool bfs(){fill(vis,vis+maxn,false);queue<int> q;q.push(S);vis[S]=true;d[S]=0;int u,to;while(!q.empty()){u=q.front();q.pop();for(int k=head[u];k!=-1;k=edge[k].next)if(!vis[to=edge[k].to]&&edge[k].f){d[to]=d[u]+1;vis[to]=true;q.push(to);}}return vis[T];
}int dfs(int u,int minf){if(u==T||!minf) return minf;int flow=0,f,to;if(cur[u]==-2) cur[u]=head[u];for(int& k=cur[u];k!=-1;k=edge[k].next)if(d[to=edge[k].to]==d[u]+1&&(f=dfs(to,min(edge[k].f,minf)))){edge[k].f-=f;edge[k^1].f+=f;flow+=f;minf-=f;if(!minf) break;}return flow;
}int maxflow(){int flow=0;while(bfs()){fill(cur,cur+maxn,-2);flow+=dfs(S,INF);}return flow;
}int main()
{fill(head,head+maxn,-1);N=read();M=read();S=0;T=N*M+1;color[0][0]=1;int x;LL tot=0;for(int i=1;i<=N;i++)for(int j=1;j<=M;j++){if((i%2&&j%2)||(i%2==0&&j%2==0)) color[i][j]=1;else color[i][j]=0;}for(int i=1;i<=N;i++)for(int j=1;j<=M;j++){x=read();tot+=x;if(color[i][j]) build(M*(i-1)+j,T,x);else{build(S,M*(i-1)+j,x);for(int k=0;k<4;k++){int nx=i+X[k],ny=j+Y[k];if(nx>0&&ny>0&&nx<=N&&ny<=M) build(M*(i-1)+j,M*(nx-1)+ny,INF);}}}cout<<tot-maxflow()<<endl;return 0;
}

最小点权覆盖集最大点权独立集相关推荐

  1. 网络流之最小点权覆盖和最大点权独立集学习

    转载:http://yzmduncan.iteye.com/blog/1149057 二分图最小点覆盖和最大独立集都可以转化为最大匹配求解.在这个基础上,把每个点赋予一个非负的权值,这两个问题就转化为 ...

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

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

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

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

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

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

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

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

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

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

  7. HDU 1569 最大点权独立集

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

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

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

  9. POJ 3308 Paratroopers (对数转换+最小点权覆盖)

    题意 敌人侵略r*c的地图.为了消灭敌人,可以在某一行或者某一列安置超级大炮.每一个大炮可以瞬间消灭这一行(或者列)的敌人.安装消灭第i行的大炮消费是ri.安装消灭第j行的大炮消费是ci现在有n个敌人 ...

最新文章

  1. SpringBoot第十一篇:springboot集成swagger2,构建优雅的Restful API
  2. 防止Excel导入超大带格式文本乱码的方法
  3. [C#] 等待启动的进程执行完毕
  4. Shell(8)——for、while、until
  5. python矩阵中找满足条件的元素_Python 找到列表中满足某些条件的元素方法
  6. 01-mysql数据库入门篇-认识mysql-01-05
  7. kafka整合ldap权限管理
  8. matlab中nc文件,教程合集 | MATLAB文件读写(以nc与txt为例)
  9. 开发环境和运行环境_内网安全运行环境
  10. jqGrid中时间控件input的值赋给点开后的laydate控件
  11. HTML CSS 兼容所有浏览器的自定义鼠标样式
  12. 311 复制文件的异常处理
  13. 分享一个自己做的记账的小程序 - 智能记账,欢迎朋友们体验
  14. linux微软雅黑字体库_一条命令搞定Linux字体渲染——Ubuntu系发行版微软雅黑+宋体终极解决方案...
  15. 数组取交集、并集与补集
  16. SQLServer2019 如何导出单张表数据
  17. Python代码调试
  18. 服务——Service
  19. MySQLsqlyog详细内容
  20. Common Data Model (CDM)通用数据模型1

热门文章

  1. 计算机网络功能可归纳为,计算机网络的功能
  2. 坐标型动态规划——轰炸敌人
  3. 设置stm32时钟频率 的flash等待问题?
  4. 世界最大的两个BT网站被迫下线 ExtraTorrent遭遇DDoS攻击
  5. LTspice基础教程-011.仿真相关文件介绍
  6. 世界元素多元化发展,法国名酒贾斯特里尼布鲁克斯受推崇
  7. 毕业两年的大专生程序员工作总结(java后端)
  8. 九年义务教育的精英,遇上十年寒窗苦读的翘楚,必将擦出耀眼的火花!
  9. knn基础与优化2--ball tree、LSH
  10. 图文细说11种计算机图标符号的历史