POJ-3041
思路:将n个行看作n个点{x_i}(i=1, ..., n),n个列也看作n个点{y_j}(j=1, ..., n)。每个障碍看作一条无向边(x_i, y_j)。则该问题能够归结为求二分图最小点覆盖数,由于最小点覆盖数等于最大匹配数,因此用匈牙利算法求出最大匹配数即可。
算法:
1. 生成两个整数n和m,将网格的规模输入到n,障碍的个数输入到m。
生成一个二维数组g[n][n],两个一维数组match[n]和chk[n]。
g初始化为全0(g[i][j]==1表示i行j列有一个障碍,g[i][j]==0则表示无障碍)。
match初始化为全0(match[j]==i表示y_j的当前匹配到行x_i,match[j]==0时表示未匹配)。
(chk[j]==0表示y_j未被检查,更确切而言是指在这轮步骤中已被匹配,chk[j]==0则表示已被检查)
生成一个整数ans用于保存结果,初始化为0。
2. 依次将m个障碍的所在行列输入到二维数组g。
3. for i from 1 to n do:
1. chk初始化为全0。
2. 对i行执行下述dfs步骤,若dfs步骤返回成功匹配,则将ans加1:
(每次返回成功匹配时,match都会更新,否则不变)
1. for j from 1 to n do:
若第i行j列存在障碍,并且y_j未被检查,则执行下述步骤:
1. 设置y_j已被检查。
2. 若第j列是第一次匹配,则设置match[j]=i并返回成功匹配。
若第j列不是第一次匹配,则执行下述步骤:
1. 生成一个整数t,并设置t=match[j],match[j]=i。
2. 对t行执行dfs步骤,若返回未成功匹配,则将match[j]恢复
为t,否则返回成功匹配。
2. 返回未成功匹配。
4. 输出ans。
#include <iostream>
#include <cstring> using namespace std; int n;
int g[][], match[], chk[]; int dfs(int i)
{
for (int j = ; j <= n; ++j)
{
if (g[i][j] && !chk[j])
{
++chk[j];
if (!match[j])
{
match[j] = i;
return ;
}
else
{
int t = match[j];
match[j] = i;
if (!dfs(t))
{
match[j] = t;
}
else
{
return ;
}
}
}
}
return ;
} int main()
{
int m, ans = ;
cin >> n >> m;
while (m--)
{
int x, y;
cin >> x >> y;
++g[x][y];
}
for (int i = ; i <= n; ++i)
{
memset(chk, 0x00, sizeof(chk));
ans += dfs(i);
}
cout << ans << endl;
return ;
}
POJ-3041的更多相关文章
- POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)
题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...
- POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)
POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配) Description Bessie wants to navigate her spa ...
- 二分图 最小点覆盖 poj 3041
题目链接:Asteroids - POJ 3041 - Virtual Judge https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...
- POJ 3041 Asteroids (对偶性,二分图匹配)
题目:POJ 3041 Asteroids http://poj.org/problem?id=3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好. 挑战 ...
- poj 3041——Asteroids
poj 3041——Asteroids Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 22604 Accep ...
- 二分图最大匹配(匈牙利算法) POJ 3041 Asteroids
题目传送门 /* 题意:每次能消灭一行或一列的障碍物,要求最少的次数. 匈牙利算法:把行和列看做两个集合,当有障碍物连接时连一条边,问题转换为最小点覆盖数==二分图最大匹配数 趣味入门:http:// ...
- Asteroids POJ - 3041 二分图最小点覆盖
Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...
- Asteroids POJ - 3041
Asteroids POJ - 3041 题目大意:N*N的地图里,存在一些小行星,Bessie有个很牛x但又很耗蓝的武器,一次可以消灭一行或者一列的所有小行星,问最少使用多少次这个武器可以消灭所有的 ...
- 二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041
最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到. POJ 1469 ...
- POJ 3041 Asteroids 匈牙利算法,最大流解法,行列为点 难度:1
http://poj.org/problem?id=3041 #include <cstdio> #include <cstring> #include <vector& ...
随机推荐
- [nRF51822] 15、穿戴式设备上电量检测装置的设计及细节技术点(偏专业硬件文章)
穿戴式 设备如智能手环.智能手表一般采用几百毫安时的锂离子电池来供电.因此,与之配套的充电电路.稳压电路和电池电量检测电路便必不可少!本文主要谈谈该类消费类电子内部电池电量检测的一般方法及其优缺点. ...
- [OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题
[OpenGL][SharpGL]用Polygon Offset解决z-fighting和stitching问题 本文参考了(http://www.zeuscmd.com/tutorials/open ...
- 《Entity Framework 6 Recipes》中文翻译系列 (46) ------ 第八章 POCO之领域对象测试和仓储测试
翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 8-8 测试领域对象 问题 你想为领域对象创建单元测试. 这主要用于,测试特定的数 ...
- python安装locustio报错error: invalid command 'bdist_wheel'的解决方法
locust--scalable user load testing tool writen in Python(是用python写的.规模化.可扩展的测试性能的工具) 安装locustio需要的环境 ...
- iOS-APP发布应注意
地区范围文件不用填 电话号码前缀是86
- MyEclipse中屏蔽js检验
方法一: 右键工程-->properties-->Myeclipse-->validation-->Excluded Resource,勾选需要取消验证的文件或者文件夹就可以了 ...
- php ajax 交互
html 页面 <body> <button id="oBtn">点击我</button> <script type="text ...
- Spring学习记录(七)---表达式语言-SpEL
SpEL---Spring Expression Language:是一个支持运行时查询和操作对象图表达式语言.使用#{...}作为定界符,为bean属性动态赋值提供了便利. ①对于普通的赋值,用Sp ...
- 在MacOS 10.12上安装Tomcat8.5
在MacOS 10.12上安装Tomcat8.5 原文链接:https://wolfpaulus.com/journal/mac/tomcat8/ Context 已安装Java,使用java -ve ...
- C#设计模式系列:单一职责原则(Single Responsibility Principle)
1.单一职责原则的核心思想 一个类应该有且只有一个变化的原因. 2.为什么要引入单一职责原则 单一职责原则将不同的职责分离到单独的类,每一个职责都是一个变化的中心.当需求变化时,这个变化将通过更改职责 ...