https://vjudge.net/problem/UVA-12549

题意:

在一个Y行X列的网格里有空地(.),重要位置(*)和障碍物(#),用最少的机器人看守所有重要位置,每个机器人要放在一个格子里,面朝上下左右4个方向之一。机器人会发出激光,一直射到障碍物为止,沿途都是看守范围。

思路:

把每个坐标的x和y值连成一条边,分别作为二分图的两边,用最少的点去覆盖所有的边,也就是二分图的最大匹配。由于有障碍物的存在,在建图的时候需要拆分点。

 #include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std; const int maxn = + ; int n, m;
int row_num, col_num;
int map[maxn][maxn];
int G[maxn][maxn];
int match[maxn];
int vis[maxn]; pair<int, int> g[maxn][maxn]; bool dfs(int u)
{
for (int j = ; j <= col_num; j++)
{
if (!vis[j] && G[u][j])
{
vis[j] = ;
if (match[j] == - || dfs(match[j]))
{
match[j] = u;
return true;
}
}
}
return false;
} int main()
{
//freopen("D:\\txt.txt", "r", stdin);
int T;
scanf("%d", &T);
while (T--)
{
scanf("%d%d", &n, &m);
memset(map, , sizeof(map));
memset(G, , sizeof(G));
memset(match, -, sizeof(match));
int t, x, y;
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &x, &y);
map[x][y] = ;
}
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &x, &y);
map[x][y] = -;
} row_num = ;
for (int i = ; i <= n; i++)
{
bool flag = true;
for (int j = ; j <= m; j++)
{
if (map[i][j] == )
{ if (flag) row_num++;
g[i][j].first = row_num;
flag = false;
}
if (map[i][j] == -)
flag = ;
}
} col_num = ;
for (int j = ; j <= m; j++)
{
bool flag = true;
for (int i = ; i <= n; i++)
{
if (map[i][j] == )
{
if (flag) col_num++;
g[i][j].second = col_num;
flag = false;
}
if (map[i][j] == -)
flag = true;
}
}
for (int i = ; i <= n;i++)
for (int j = ; j <= m;j++)
if (map[i][j] == ) G[g[i][j].first][g[i][j].second] = ;
int ans = ;
for (int i = ; i <= row_num; i++)
{
memset(vis, , sizeof(vis));
if (dfs(i)) ans++;
}
printf("%d\n", ans);
}
return ;
}

最新文章

  1. 个人对于Virtual DOM的一些理解
  2. 深入理解docker的link机制
  3. PAT乙级 1010. 一元多项式求导 (25)
  4. HTTP 头部解释
  5. php.ini xdebug
  6. Android与Mysql服务器通信
  7. yiic创建YII应用 &quot;php.exe&quot;不是内部或外部命令 解决办法
  8. 事关Animation Tree的工作随笔(二)
  9. 【转载】GPIO模拟i2c通信
  10. Less的内置函数
  11. P4015 运输问题 网络流问题
  12. 通过javap终极理解++i和i++的区别
  13. 【温故知新】HTTP请求GET和POST的用法和区别
  14. Jmeter学习之-从数据库取出数据并且校验数据是否准确
  15. Linux配置SSH免登录
  16. DoTween
  17. js三目学习
  18. 使用 IntelliJ IDEA 导入 Spark 最新源码及编译 Spark 源代码(博主强烈推荐)
  19. Normal Map中的值, Tangent Space, 求算 Tangent 与 Binormal 与 TBN Matrix
  20. jquery判断输入框的字符串是否为空或者空格

热门文章

  1. ansible的入门级使用
  2. c# winform窗体边框风格的设计
  3. js对字符串进行加密和解密方法!
  4. mysql GROUP_CONCAT 用法
  5. Zend_Framework_1 框架是如何被启动的?
  6. 使用Dataset构建数据到lgb中
  7. HanLP https://pypi.python.org/pypi/sumy/
  8. 为什么 要弄清楚 mysql int(5) int(11) bigint 自建mysql主键id python random 科学计数法
  9. 去掉chrome、safari input或textarea在得到焦点时出现黄色边框的方法
  10. TCP协议通讯工作原理