思路:将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的更多相关文章

  1. POJ 2226 Muddy Fields (最小点覆盖集,对比POJ 3041)

    题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障 ...

  2. POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配)

    POJ 3041 Asteroids / UESTC 253 Asteroids(二分图最大匹配,最小点匹配) Description Bessie wants to navigate her spa ...

  3. 二分图 最小点覆盖 poj 3041

    题目链接:Asteroids - POJ 3041 - Virtual Judge  https://vjudge.net/problem/POJ-3041 第一行输入一个n和一个m表示在n*n的网格 ...

  4. POJ 3041 Asteroids (对偶性,二分图匹配)

    题目:POJ 3041 Asteroids http://poj.org/problem?id=3041 分析: 把位置下标看出一条边,这显然是一个二分图最小顶点覆盖的问题,Hungary就好. 挑战 ...

  5. poj 3041——Asteroids

    poj       3041——Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 22604   Accep ...

  6. 二分图最大匹配(匈牙利算法) POJ 3041 Asteroids

    题目传送门 /* 题意:每次能消灭一行或一列的障碍物,要求最少的次数. 匈牙利算法:把行和列看做两个集合,当有障碍物连接时连一条边,问题转换为最小点覆盖数==二分图最大匹配数 趣味入门:http:// ...

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

       Asteroids POJ - 3041 Bessie wants to navigate her spaceship through a dangerous asteroid field in ...

  8. Asteroids POJ - 3041

    Asteroids POJ - 3041 题目大意:N*N的地图里,存在一些小行星,Bessie有个很牛x但又很耗蓝的武器,一次可以消灭一行或者一列的所有小行星,问最少使用多少次这个武器可以消灭所有的 ...

  9. 二分图匹配 最大匹配数+最大点覆盖 POJ 1469+POJ 3041

    最大匹配数就等于最大点覆盖,因为在图里面,凡是要覆盖的点必定是连通的,而最大匹配之后,若还有点没有覆盖到,则必定有新的匹配,与最大匹配数矛盾,如果去掉一些匹配,则必定有点没有覆盖到. POJ 1469 ...

  10. POJ 3041 Asteroids 匈牙利算法,最大流解法,行列为点 难度:1

    http://poj.org/problem?id=3041 #include <cstdio> #include <cstring> #include <vector& ...

随机推荐

  1. Unbroken(坚不可摧)——Mateusz M

    Unbroken(坚不可摧)——Mateusz M YouTube励志红人账号Mateusz M 的作品,短片由几位演讲家Les Brown.Eric Thomas.Steve Jobs.Louis ...

  2. Android开发学习之路-Android6.0运行时权限

    在Android6.0以后开始,对于部分敏感的“危险”权限,需要在应用运行时向用户申请,只有用户允许的情况下这个权限才会被授予给应用.这对于用户来说,无疑是一个提升安全性的做法.那么对于开发者,应该怎 ...

  3. 查看Validate Subscription 的结果

    Sql Server Replication Monitor 提供一个feature,能够verify Replication的 Publication 和 Subscription 的数据同步sta ...

  4. VB.NET 如何进行调用HTTP外部接口

    直接上干货  Private Function POST(ByVal URL$, ByVal data$) Dim http On Error Resume Next http = CreateObj ...

  5. Eclipse迁移到Android studio步骤如下:

    一.从Eclipse中导出:1.将你的ADT插件版本升级到22.0以上.2.在Eclipse中,选择File-->Export.3.在弹出的导出窗口中,打开Android的文件夹,选择“Gene ...

  6. 静态Include和动态Include测试并总结

    主要代码 hjzgg.css .center-div{ width:auto; margin-left: 40%; margin-right: 40%; display: block; positio ...

  7. Android微信分享图片大于32k进行压缩

    微信分享视频的时候,需要传一个图片数组,大小不能大于32k. 解决方案:使用Bitmap自带的compress方法解决了这个问题. 源码如下: <span style="font-si ...

  8. gsoap设置超时

    1.修改gsoap自动生成的代码才能进行超时设置(我这边访问web service的代码都是gsoap工具自动生成.根据wsdl接口) 2.找到生成的soapwwwsdlBindingProxy.cp ...

  9. Objective-C中把数组中字典中的数据转换成URL

    可能上面的标题有些拗口,学过PHP的小伙伴们都知道,PHP中的数组的下标是允许我们自定义的,PHP中的数组确切的说就是键值对.而在OC我们要用字典(Dictionary)来存储,当然了Java用的是M ...

  10. 关于《selenium2自动测试实战--基于Python语言》

    关于本书的类型: 首先在我看来技术书分为两类,一类是“思想”,一类是“操作手册”. 对于思想类的书,一般作者有很多年经验积累,这类书需要细读与品位.高手读了会深有体会,豁然开朗.新手读了不止所云,甚至 ...