uva 11419 最大匹配(最小点覆盖)
链接:https://vjudge.net/problem/27475
题意:给定一个二维矩阵,在一些格子里放置了东西,然后你有一门炮,每次能横向或纵向开一炮,将这一行所有的东西摧毁。问你最少花多少炮弹摧毁所有的东西?并输出一组解。
题解:
很久之前做的题目了,今天在看到的时候还是很有新的体会的。这是一个求最小覆盖的问题,最小点覆盖,将行列的每个点看作是x,y集合,将放置的东西的地方看作是边(大白书)。然后求一次最大匹配,会得出来至少有多个点是不在同一行和同一列的,这样剩余的东西就会与原来的已匹配的点在同一行或者同一列,求完最大匹配后,可以得出开枪的次数,然后进行求方案数。从未匹配的点开始拓展,第一次没有参与匹配的点 在哪一行最多 或者在哪一列最多 那么肯定开枪位置就在这一行 或者这一列,这里的左右集合表现的很明显,因为记录 路径的缘故。
参考代码:
#include <stdio.h> #include <algorithm> #include <math.h> #include <string.h> #include <vector> #include <queue> #include <stack> #include <iostream> #define INF 0x3f3f3f3f using namespace std; const int maxn=1011; int mp[maxn][maxn]; int machl[maxn],machr[maxn],visx[maxn],visy[maxn]; int n,m,k; bool dfs(int u) {visx[u]=1;for(int i=1;i<=m;i++)if(!visy[i]&&mp[u][i]){visy[i]=true;if(machr[i]==-1||dfs(machr[i])){machl[u]=i;//列匹配machr[i]=u;//行匹配return true;}}return false; } int Maxmach() {int ans=0;memset(machl,-1,sizeof(machl));memset(machr,-1,sizeof(machr));for(int i=1;i<=n;i++){memset(visy,0,sizeof(visy));if(dfs(i))ans++;}return ans; } int main() {//freopen("C:\\Users\\Administrator\\Desktop\\a.txt","r",stdin);int a,b;while(scanf("%d%d%d",&n,&m,&k),n+m+k){memset(mp,0,sizeof(mp));for(int i=0;i<k;i++)scanf("%d%d",&a,&b),mp[a][b]=1;int Ans=Maxmach();printf("%d",Ans);//求方案数 memset(visx,0,sizeof(visx));memset(visy,0,sizeof visy);for(int i=1;i<=n;i++) //从x中未匹配的点出发if(machl[i]==-1) dfs(i);for(int i=1;i<=n;i++)if(!visx[i]) printf(" r%d",i);for(int i=1;i<=m;i++)if(visy[i]) printf(" c%d",i);printf("\n");}return 0; }
转载于:https://www.cnblogs.com/MeowMeowMeow/p/7592641.html
uva 11419 最大匹配(最小点覆盖)相关推荐
- ssl1341-Asteroids【最大匹配,最小点覆盖,图论】
正题 大意 一个n*n的矩阵里有m个点,你可以一下打掉一排或以列,求打掉所以点要的最小次数. 如: X.X .X. .X. 显然可以看出只需要打两枪. 解题思路 将行和列分为一个二分图,然后每个点的坐 ...
- `Computer-Algorithm` 二分图BipartiteGraph,最大匹配,最小点覆盖,最大独立集
Contents 术语 二分图 旧解释 染色法判定二分图 经验总结 匈牙利算法计算最大匹配 例题 经验总结 点覆盖 在二分图中 例题 独立集 二分图中 例题 延伸阅读 术语 A Bipartite-G ...
- POJ - 3041 Asteroids 二分图最小点覆盖
题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...
- UVA 11419 SAM I AM(最大二分匹配最小点覆盖:König定理)
题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示"行& ...
- HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...
- POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...
- HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)
题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...
- HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...
- 二分图----最大匹配,最小点覆盖,最大点独立集
一.二分图 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不 ...
最新文章
- ajax如何请求json文件,简单的ajax请求加载外部json文件
- Web.xml 文件与server.xml 文件使用总结
- 基于内容的图像检索 Database for Content-Based Image Retrieval
- DCMTK:基本工作清单管理服务类提供程序基于一组文件作为数据源
- SAP CRM product category search - hidden search attribute
- 2022. 将一维数组转变成二维数组
- mysql报错Attempted to open a previously opened tablespace的解决办法
- 2017.3.18 糖果 思考记录
- 低压锅炉行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
- 如何构建数据指标体系?
- python快乐数,快乐数 - SegmentFault 思否
- R语言绘制校正协变量后的ROC曲线
- c语言常量要const,C语言常量-C语言const-嗨客网
- 面包板电源线怎么接_面包板的结构和使用方法详细介绍
- 维护两个互斥的定价条件
- 如何在php文件中插入图片,使用PHPWord读取Word文件并插入图片
- java加载dll文件失败
- Implicit Neural Representations with Periodic Activation Functions
- python3中使用ADFtest
- 矩阵求逆(全选主元高斯-约当消去法)