Sentry Robots

Uva 12549 Sentry Robots 网络流 - 二分图匹配 题目大意见紫书P381。  这道题是比较明显的二分图建模吧, 这类题的建模思维很常见, 对于每个点, 对应的横纵坐标只需要选一个点, 那么将横纵坐标看作在二分图两边的两个点然后连边即可, 只是这题有障碍物所以不能单纯的按上面提到的横纵坐标来, 要经过处理。 #include #include #include #include #include #include #includ 阅读详情

We need to guard a set of points of interest using sentry robots that can
not move or turn. We can position a sentry at any position facing either
north, south, east or west. Once a sentry is settled, it guards the points of
interest that are infront of it. If two or more points are in the same row
or column a single robot can guard them all. Unfortunately, there are also
some obstacles that the robot cannot see through.
From a set of points of interest and obstacles lying on a grid, calculate
the minimum number of robots needed to guard all the points. In order to guard a point of interest, a
robot must be facing the direction of this point and must not be any obstacles in between.
Given the following grid, where # represents an obstacle and * a point of interest, the minimum
number of robots needed is 2 (a possible position and orientation is shown using arrows for each robot).
Note that this is not the actual input or output, just a figure.
For the following grid we need 4 robots because of the obstacles.
Input
The first line of the input has an integer C representing the number of test cases that follow. Before
each test case there is an empty line.
For each case, the first line has 2 integers, Y and X, representing the height and width of the grid.
The next line has an integer that indicates the number of points of interest P. The following P lines
will have the positions py and px of the points of interest, one point per line. The next line has an
integer that indicates the number of obstacles W. The following W lines will have the positions wy
and wx of an obstacle, one per line.
Output
For each test case print the minimum number of robots needed to guard all the points of interest, one
per line.
CONSTRAINTS:
1 ≤ C ≤ 50
1 ≤ Y, X ≤ 100
0 ≤ P ≤ Y ∗ X
0 ≤ W ≤ Y ∗ X
0 ≤ P + W ≤ Y ∗ X
1 ≤ px, wx ≤ X
1 ≤ py, wy ≤ Y
Sample Input
2
4 6
4
2 2
2 4
4 2
4 4
3
2 3
3 3
4 3
4 5
6
1 2
1 3
2 4
2 2
3 3
4 3
2
2 3
3 2
Sample Output
2
4
这个和之前写的扫射差不多,注意到(一般都注意不到- -,这个简单一点)向左打和向右打是无区别的,向上和向下也是,所以直接解析为向右和向下,然后做标记,连接,匹配,最后出来答案。具体原理之前博文说过了。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
#include<vector>
#include<algorithm>
#include<string>
#include<cmath>
#include<set>
#include<map>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int maxn = 1005;
int a[105][105], l[105][105], r[105][105];
int leap[505][505], vis[505], g[505], x, y, numl, numr;
bool find(int x)
{
    int i, j;
    for (j = 1; j <= numr; j++){
        if (leap[x][j] && !vis[j]){
            vis[j] = 1;
            if (g[j] == 0 || find(g[j])){
                g[j] = x;
                return true;
            }
        }
    }
    return false;
}
int main()
{
    int i, j, m, n, ans, t;
    cin >> t;
    while (t--)
    {
        cin >> y >> x;
        memset(a, 0, sizeof(a));
        memset(l, 0, sizeof(l));
        memset(r, 0, sizeof(r));
        memset(leap, 0, sizeof(leap));
        int c;
        cin >> c;
        for (i = 1; i <= c; i++){
            cin >> m >> n;
            a[m][n] = 1;
        }
        cin >> c;
        for (i = 1; i <= c; i++){
            cin >> m >> n;
            a[m][n] = 2;
        }
        int cnt = 1, flag1, flag2;
        for (i = 1; i <= y; i++){
            flag1 = 0; flag2 = 0;
            for (j = 1; j <= x; j++){
                if (a[i][j] == 1&&!flag2){
                    flag1 = 1;
                    l[i][j] = cnt;
                    numl = cnt;
                }
                else if (a[i][j] == 1){
                    cnt++;
                    numl = cnt;
                    l[i][j] = cnt;
                    flag2 = 0;
                }
                else if (a[i][j] == 2 && flag1)flag2 = 1;
            }
            if (flag1)cnt++;
        }
        cnt = 1;
        for (j = 1; j <= x; j++){
            flag1 = 0; flag2 = 0;
            for (i = 1; i <= y; i++){
                if (a[i][j] == 1&&!flag2){
                    flag1 = 1;
                    r[i][j] = cnt;
                    numr = cnt;
                }
                else if (a[i][j] == 1)
                {
                    cnt++; numr = cnt;
                    r[i][j] = cnt;
                    flag2 = 0;
                }
                else if (a[i][j] == 2 && flag1)flag2 = 1;
            }
            if (flag1)cnt++;
        }
        for (i = 1; i <= y; i++)
        for (j = 1; j <= x; j++)
        if (l[i][j] && r[i][j])
            leap[l[i][j]][r[i][j]] = 1;
        memset(g, 0, sizeof(g));
        ans = 0;
        for (i = 1; i <= numl; i++){
            memset(vis, 0, sizeof(vis));
            if (find(i))ans++;
        }
        cout << ans << endl;
    }
    return 0;
}
uva12549 Sentry Robots(二分图) 和HDU 5093 是一样的 题意: 在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个格子里,面朝上下左右4个方向之一。机器人会发出激光,一直射到障碍物为止,沿途都是看守范围。 思路:给行块和列块标号,在重要位置处连边,然后匹配 #include &lt;stdio.h&gt; #include &lt;string.... 阅读详情

相关推荐

构建合规BBC新闻爬虫:从Robots协议到数据存储的工程实践

网络爬虫是自动化获取互联网公开数据的关键技术,其核心原理是通过模拟浏览器发送HTTP请求,解析返回的HTML文档,并从中提取结构化信息。这项技术对于舆情监控、市场研究和AI训练数据准备具有重要价值,广泛应用于新闻聚合、价格追踪和学术研究等场景。在实践过程中,开发者必须优先考虑合规性与代码健壮性,例如严格遵守Robots协议、设置合理请求延迟以尊重网站服务器,并应对动态加载内容等反爬机制。本文以BBC新闻网站为例,详细阐述了如何构建一个负责任且可维护的爬虫系统,涵盖从环境搭建、页面解析到数据清洗和SQLite

weixin_30268921的博客 519

12549 - Sentry Robots (二分图匹配)

该题和HDU 5093 如出一辙 传送门  。即求解二分图最大匹配数 = 最小点集覆盖 。 该题要求用尽量少的机器人看守所有重要的点,并且障碍物会阻隔机器人的看守范围  。 我们不妨将行列分开,按照行和列的最大看守范围编号,这样得到的就是最大匹配数 。 由于要求看守所有重要的点,所以这样可以有效去重,进行了最大匹配之后还可以保证一定看守了所有的点 。 建好图之后套Dinic模板就行了 。 该题

AC_Arthur的专栏 1586

react-native报错信息之Can't find variable

在前端的路途上遇见了react-native,正如我带你如初恋你却虐我千百边,所有把爬坑的错误记录下拉供后面的小伙伴学习分享!在进行路由导航配置的时候出现了找不到变量(Can'tfindvariable)Can'tfindvariable:Button如下...

追梦猪的博客 8209

[二分图最大匹配=最小覆盖点]uva12549 Sentry Robots

#include using namespace std; const int maxn = 2500 + 10; const int N=100 +10; int X,Y; int g[maxn][maxn], linker[maxn]; bool vis[maxn]; int mapp[N][N],n,m; pair Map[N][N]; bool dfs(int u){ for(in

Dosth_Magic 710

Sentry Robots, ACM/ICPC SWERC 2012, UVa12549 【二分图】

#include using namespace std; const int N = 5002; const int maxn = 101; char g[maxn][maxn]; int Yid[maxn][maxn],Y_cnt; int match[N]; int dfsT[N],dfsTime; vector G[N]; #define PB push_back bool dfs(in

skysys的研究小屋 674

【网络安全】Centos7安装杀毒软件----ClamAV

Clam AntiVirus是一个Linux系统上使用的反病毒软件包。主要应用于邮件服务器,采用多线程后台操作,可以自动升级病毒库。

你在看屏幕的同时,屏幕也在注视着你 8827

Sentry Robots UVA - 12549 (二分图最小覆盖+图的转化)

传送门 题意:在一个Y行X列的网格里有空顶.,重要位置*和障碍物#,用最少的机器人看守所有重要位置。每个机器人放在一个格子里,面朝上下左右四个方向,机器人会发出激光,一直碰到障碍物为止,机器人不会阻挡射线,不同的机器人不能放在同一个格子。 题解:这道题是传送门这道题的发展版,如果说把这道题的障碍物转化为不带障碍物的模型就好了,如何进行转化,从上到下,从左到右遍历每个点,遇到障碍时,就将障碍以及...

肘子的博客 263

BERT之提取特征向量 及 bert-as-server的使用

本文内容列表提取句向量1、句向量简介1-1传统句向量1-2、BERT句向量2、 extract_features.py源码分析2-1 main函数 前一篇文章 BERT介绍及中文文本相似度任务实践 简单介绍了使用BERT进行中文文本相似度计算的方法,这篇文章着重对特征提取方法进行讲述。 提取句向量 1、句向量简介 1-1传统句向量 更多采用word embedding的方式取加权平均,该方法的一大...

ling620的专栏 1万+

Sentry Robots UVA - 12549

该题主要用的思想在于图的最小点集覆盖等于边的最大匹配数。按照行以及列进行重新计数,然后按照匈牙利算法求出结果即可,具体实现见如下代码: #include #include #include #include #include #include #include #include #include #include #include #include #include #include #incl

zju2016的博客 369

PID不够用?试试用ADRC改造你的ArduCopter:从Simulink仿真到SITL测试全记录

本文详细介绍了如何将ADRC(自抗扰控制)算法集成到ArduPilot飞控中,以替代传统PID控制器。通过Simulink建模、参数整定和SITL仿真测试,展示了ADRC在抗扰动能力、响应速度和参数调节复杂度上的优势,特别适合无人机在强风扰动下的稳定控制。

weixin_32349093的博客 273

手把手教你解决Keil5安装时xerces-c_3_0.dll缺失和0xc000007b报错(附文件下载与路径设置)

本文详细解析了Keil5安装过程中常见的xerces-c_3_0.dll缺失和0xc000007b报错问题,提供了从文件获取、路径设置到系统配置的完整解决方案。同时,文章还涵盖了STM32开发环境的搭建技巧和最佳实践,帮助开发者快速构建稳定的嵌入式开发环境。

weixin_29164497的博客 599

UVA 12549 Sentry Robots 最小点集覆盖

这题的模型是二分图最小点集覆盖 即选择最少的行或列来覆盖所有的点 二分图最小点集覆盖 = 最大匹配数 本题需要注意的是障碍物会把行和列分隔开来 所以要拆行拆列 #include #include #include #include using namespace std; const int maxn = 2500 + 10; const int N = 100 + 10; in

s_h_r 1460

[运营] ext4分区遇到“Structure needs cleaning”问题,怎么解决 - 结构需要清理

摘要:当ext4文件系统出现"Structure needs cleaning"错误时,表明存在元数据损坏。解决方法包括:1)检查系统日志确认错误;2)卸载受影响分区;3)使用fsck.ext4分步骤修复(先测试模式-n,再保守修复-p,严重损坏时用-y强制修复);4)检查修复结果;5)重新挂载。若数据丢失可尝试从lost+found恢复。建议定期备份、避免异常关机并定期检查文件系统,以防硬件故障导致类似问题。修复前务必备份重要数据。

Rudon滨海渔村的博客 1356

uva 12549 Sentry Robots 最大二分匹配

题意:在一个n*m的矩阵中,有p个重要位置,w个墙壁,现在要在重要位置处安置机器守卫,守卫可以朝一个方向扫描,守卫安置后,它朝向的所有重要位置,都将被覆盖,可以确保安全,但是墙壁可以阻碍视线。墙壁后的机器无法守卫。求用最少的机器,使得所有重要位置覆盖。 思路:二分匹配求最小点覆盖。最大二分匹配=最小点覆盖。 #include #include #include #include using n

chen_minghui的博客 427

手把手教你用C#和LibUsbDotNet实现USB设备通信(含完整代码示例)

本文详细介绍了如何使用C#和LibUsbDotNet库实现USB设备通信,包括设备识别、连接建立、同步/异步数据读写等核心操作。通过完整的代码示例,开发者可以快速掌握USB通信的关键技术,适用于工业自动化、医疗设备等多种场景。重点讲解了数据读写优化和错误处理技巧,帮助提升通信效率和可靠性。

a3b4c5的博客 703

2025.1.16——五、LoveSQL1 sqlmap文件类|万能密码

题目来源:BUUCTF[极客大挑战2019]LoveSQL1。

2402_87387800的博客 1066

UVAlive 6156 Sentry Robots

题意: n*m的矩形格子中有一些宝藏,有些点不能经过,每次可以取走一横行,或者一纵行的宝藏,求至少需要多少次取走所有宝藏 题解: 如果没有不能走的点,就是一道经典的二分图匹配的最小点覆盖。考虑障碍,在同一行(或列)被障碍隔开的点就不能算同一行(或列),所以重置坐标即可,进行二分图匹配。 代码: #include #include #include #include using n

Tri_integral的专栏 1204

手把手教你学GPU的KMD专栏--2.4 GPU固件加载与初始化流程

GPU固件(Firmware)是嵌入在GPU芯片ROM或EEPROM中的低级代码,是GPU启动时首先执行的程序。它负责GPU硬件的基础初始化和基本功能配置,是GPU与操作系统之间的"第一道桥梁"。与操作系统驱动不同,固件在CPU启动后、操作系统加载前就已执行,是硬件层面的"启动代码"。关键认知:GPU固件是GPU的"BIOS",没有它,GPU硬件无法进入可操作状态。就像CPU需要BIOS来初始化内存和外设一样,GPU需要固件来初始化其核心组件。

MHD0815的博客 110

UVA 12549(p381)----Sentry Robots

#include #include #include #include #include using namespace std; const int maxn=1100; struct point { int x,y; }; point mm[maxn][maxn]; int from[maxn],use[maxn]; int Map[maxn][maxn]; int n,m,t,num

哆啦AC梦的博客 771

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Sentry Robots UVA - 12549 (最小点覆盖,网络流)

题目链接:点击打开链接 题目大意:懒得说了 题目思路:看题目的的问法,我们很容易想到是最小点覆盖或者边覆盖的问题,我们可以发现对于某个重要的点(x,y),只用x,y其中一个点备选中就行,是不是发现了,就是最小点覆盖的定义:求最小数量的点,使得包括每条边的至少一个端点,所以,我们对于每一个重要位置的左边,根据行列建图,从x联向y,容量为1,然后求最小点覆盖,但是这里还有一个地方就是会有障碍点

w571523631的博客 409

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

UVA 12549 Sentry Robots (最小点覆盖)

这道题挺像hdu 5093 Battle ships的,不过那道题是要求最多放置的点数,而这道题是要求最小点覆盖。 顶点覆盖的定义是:在G中任意边至少有一个端点属于顶点集合S。 一个重要的位置有(x,y)两个坐标,而要守住这个这个位置就是相当于连了一条边x到y的边。 选了一个(x,y)就相当于选了所有相同的x的边或者所有相同的y的边。 当所有的x或y被选完的时候就完成了看守。相当于是割断了...

weixin_34138255的博客 267

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Sentry Robots 组队赛第二场 Regionals 2012, Europe - Southwestern F题

题目:题目链接 题目的意思是用虽少的机器人来看守宝藏,这里的机器人只可以看守一个方向的地点,并且无法越过障碍物。给你一幅地图,上面有三种符号*代表宝藏,#代表障碍物。.代表空地。机器人需要放在宝藏点上。至少需要多少机器人才能看守住宝藏; 分析: 我们可以直接枚举宝藏点,从左上角开始,这样一行行的下来,就无需考虑上方和左方的情况,只需要考虑右方和下方的情况。这样如果一个点是宝藏点并且这个点木有被

ACM_devil 992

【uva 12549】Sentry Robots HDU 2119 (hdu 2119Matrix升级版) 最小点覆盖+二分图匹配

【uva 12549】Sentry Robots HDU 2119 (hdu 2119Matrix升级版) 最小点覆盖+二分图匹配

pbihao的博客 355

UVA 10599 Robots(II)

大意略。 思路:转换为最长上升序列来做,用一个数组记录最长上升序列,另一个数组记录路径条数,但要保证最长上升序列最长的情况下,再记录路径条数。 代码略。

Wall_F的专栏 956

ACM->uvalive->Sentry Robots(二分图匹配的最小点覆盖)

Sentry Robots Time Limit:1000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVALive 6156 Description We need to guard a set of points of interest

Fate_O的专栏 878
上一篇: Lift Hopping
下一篇: Plant
Techay
博客等级 码龄11年 11粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值