链接: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 最大匹配(最小点覆盖)相关推荐

  1. ssl1341-Asteroids【最大匹配,最小点覆盖,图论】

    正题 大意 一个n*n的矩阵里有m个点,你可以一下打掉一排或以列,求打掉所以点要的最小次数. 如: X.X .X. .X. 显然可以看出只需要打两枪. 解题思路 将行和列分为一个二分图,然后每个点的坐 ...

  2. `Computer-Algorithm` 二分图BipartiteGraph,最大匹配,最小点覆盖,最大独立集

    Contents 术语 二分图 旧解释 染色法判定二分图 经验总结 匈牙利算法计算最大匹配 例题 经验总结 点覆盖 在二分图中 例题 独立集 二分图中 例题 延伸阅读 术语 A Bipartite-G ...

  3. POJ - 3041 Asteroids 二分图最小点覆盖

    题目链接 二分图一个很重要的定理:看了很多大神的博客表示看不懂为什么,以后再看 最小点覆盖=最大匹配 最小点覆盖就是在二分图里边,选择一个点,将所有与该点相链接的边删去,问最小找多少个点能够把所有的边 ...

  4. UVA 11419 SAM I AM(最大二分匹配最小点覆盖:König定理)

    题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示"行& ...

  5. HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...

  6. POJ - 2226 Muddy Fields(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:给出一个n*m的地图,地图中'*'代表泥地,'.'代表空地,现在我们有两种木板,一种可以覆盖一行中的任意长度,我们成为行木板,另一种可以覆盖一列中的任意长度,我们成为列木 ...

  7. HDU - 3360 National Treasures(最小点覆盖-二分图最大匹配+奇偶拆点)

    题目链接:点击查看 题目大意:给出一个n*m的矩阵,每个点都有一个权值,-1表示该格子为警卫,否则表示该格子有宝物: 当前点的权值二进制为1的地方代表需要一个警卫(编号为二进制从右往左数的位置),警卫 ...

  8. HDU - 1150 Machine Schedule(最小点覆盖-二分图最大匹配)

    题目链接:点击查看 题目大意:现在有一个机器A和一个机器B,A机器有n种模式,B机器有m种模式,现在有k次工作需要完成,每次工作的信息为: id x y:编号为id,在A机器要用x模式完成,在B机器要 ...

  9. 二分图----最大匹配,最小点覆盖,最大点独立集

    一.二分图 二分图又称作二部图,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不 ...

最新文章

  1. ajax如何请求json文件,简单的ajax请求加载外部json文件
  2. Web.xml 文件与server.xml 文件使用总结
  3. 基于内容的图像检索 Database for Content-Based Image Retrieval
  4. DCMTK:基本工作清单管理服务类提供程序基于一组文件作为数据源
  5. SAP CRM product category search - hidden search attribute
  6. 2022. 将一维数组转变成二维数组
  7. mysql报错Attempted to open a previously opened tablespace的解决办法
  8. 2017.3.18 糖果 思考记录
  9. 低压锅炉行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  10. 如何构建数据指标体系?
  11. python快乐数,快乐数 - SegmentFault 思否
  12. R语言绘制校正协变量后的ROC曲线
  13. c语言常量要const,C语言常量-C语言const-嗨客网
  14. 面包板电源线怎么接_面包板的结构和使用方法详细介绍
  15. 维护两个互斥的定价条件
  16. 如何在php文件中插入图片,使用PHPWord读取Word文件并插入图片
  17. java加载dll文件失败
  18. Implicit Neural Representations with Periodic Activation Functions
  19. python3中使用ADFtest
  20. 矩阵求逆(全选主元高斯-约当消去法)

热门文章

  1. linux ps画图,PhotoGIMP:让Linux下的GIMP交互体验就像Photoshop
  2. redis 缓存模式
  3. python pathlib
  4. nginx server location
  5. Spark TopN
  6. Java 项目 接口开发规范
  7. python安装wx模板_windows下wxPython开发环境安装与配置方法
  8. 你属于开源性格测试六大分类中的哪一类呢
  9. linux 多线程并行计算,浅谈.NET下的多线程和并行计算(五)线程池基础上
  10. Servlet 实现訪问量的统计小案例