题目链接:

https://vjudge.net/problem/POJ-3041

题目大意:

给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,

最少要几次。

解题思路:

将每行、每列分别看作一个点,对于case的每一个行星坐标(x,y),将第x行和第y列连接起来,例如对于输入:

(1,1)、(1,3)、(2,2)、(3,2)4点构造图G:

这样,每个点就相当于图G的一条边,消灭所有点=消灭图G的所有边,又要求代价最少,即找到图G上的最少的点使得这些点覆盖了所有边。

根据定理吗, 最小点覆盖数=最大匹配数,所以本题转化为二分图的最大匹配问题——用匈牙利算法来解决。

传送门:二分图之匈牙利算法      二分图定理

 #include<iostream>
#include<cstring>
using namespace std;
const int maxn = + ;
int n, m;
int Map[maxn][maxn];//map[i][j]=1表示X部的i和Y部的j存在路径
int cx[maxn], cy[maxn];
bool vis[maxn];
//cx[i]表示X部i点匹配的Y部顶点的编号
//cy[i]表示Y部i点匹配的X部顶点的编号 bool dfs(int u)//dfs进入的都是X部的点
{
for(int v = ; v <= n; v++)//枚举Y部的点,判断X部的u和Y部的v是否存在路径
{
//如果存在路径并且还没被标记加入增广路
if(Map[u][v] && !vis[v])//vis数组只标记Y组
{
vis[v] = ;//标记加入增广路 //如果Y部的点v还未被匹配
//或者已经被匹配了,但是可以从v点原来匹配的cy[v]找到一条增广路
//说明这条路就可是一个正确的匹配
if(cy[v] == - || dfs(cy[v]))
{
cx[u] = v;//可以匹配,进行匹配
cy[v] = u;
return ;
}
}
}
return ;//不能匹配
}
int maxmatch()//匈牙利算法主函数
{
int ans = ;
memset(cx, -, sizeof(cx));
memset(cy, -, sizeof(cy));
for(int i = ; i <= n; i++)
{
if(cx[i] == -)//如果X部的i还未匹配
{
memset(vis, , sizeof(vis));//每次找增广路的时候清空vis
ans += dfs(i);
}
}
return ans;
}
int main()
{
cin >> n >> m;
int x, y;
for(int i = ; i < m; i++)
{
cin >> x >> y;
Map[x][y] = ;
}
cout<<maxmatch()<<endl;
}

最新文章

  1. WPF DevExpress 设置雷达图Radar样式
  2. 矢量图绘制工具Svg-edit调整画布的大小
  3. JS与树本(复杂)
  4. ePass.CreateFile
  5. zabbix_agent安装(Centos+Ubuntu)
  6. PHP登陆Session验证
  7. PHP字符串
  8. Merkle Tree算法详解
  9. C#-创建自定义双击事件
  10. 详解常用的gulp命令
  11. A comparison of local caches (1) 【本地缓存之比较 (1)】
  12. JavaScript练习2
  13. 其实你并不懂如何定义一个 PHP 函数
  14. js中session操作
  15. php 公共方法Util
  16. byte[] 解析、转码二三事
  17. 关于javac和java
  18. 启动总是提示:Process finished with exit code 0
  19. Netty核心概念(8)之Netty线程模型
  20. [luogu4389]付公主的背包(多项式exp)

热门文章

  1. my.ini /etc/my.cnf jdbc url
  2. 14-----BBS论坛
  3. 安装Office 2013 时提示找不到 Office.zh-cn\OfficeLR.cab
  4. Android Studio配置及使用OpenCV
  5. 源码剖析Linux epoll实现机制及Linux上惊群
  6. 使用git将自己的代码同时保存在多个代码托管平台
  7. [DDD]學習筆記 第15章 精煉(Distillation)
  8. Get和Post区别,EncType提交数据的格式详解——转自他人博客的
  9. 14.C#/.NET编程中的常见异常(持续更新)
  10. Start activity with App Chooser or not ?