UVA 12549 - 二分图匹配
题意:给定一个Y行X列的网格,网格种有重要位置和障碍物。要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围。机器人不会阻挡射线。

“#”表示障碍物,“*”表示重要的位置,箭头表示最终机器人匹配的位置,求出机器人能够匹配出的最少位置个数。
分析:首先看题解是二分图匹配,但是建图目前还没想到呢。每个机器人绝对都在重要位置上,假设每个重要位置上都有机器人,可以保护哪几个重要物品。看是否能够匹配得来
#include<cstdio>
#include<memory.h>
#include <iostream>
using namespace std;
#define repu(i, a, b) for(int i = (a); i < (b); i++)
#define MAX 202
bool flag,visit[MAX]; ///记录V2中的某个点是否被搜索过
int match[MAX]; ///记录与V2中的点匹配的点的编号
int cow, stall; ///二分图中左边、右边集合中顶点的数目
int head[MAX];
struct edge
{
int to,next;
} e[];
int index,X,Y;
void addedge(int u,int v)
{
///向图中加边的算法,注意加上的是有向边
///u为v的后续节点既是v---->u
e[index].to=v;
e[index].next=head[u];
head[u]=index;
index++;
}
/// 匈牙利(邻接表)算法
bool dfs(int u)
{
int i,v;
for(i = head[u]; i != ; i = e[i].next)
{
v = e[i].to;
if(!visit[v]) ///如果节点v与u相邻并且未被查找过
{
visit[v] = true; ///标记v为已查找过
if(match[v] == - || dfs(match[v])) ///如果i未在前一个匹配M中,或者i在匹配M中,但是从与i相邻的节点出发可以有增广路径
{
match[v] = u; ///记录查找成功记录,更新匹配M(即“取反”)
return true; ///返回查找成功
}
}
}
return false;
}
int g[MAX][MAX];
pair<int, int> Map[MAX][MAX];
int n,m;
void MaxMatch()
{
int i,sum=;
memset(match,-,sizeof(match));
for(i = ; i < X; ++i)
{
memset(visit,false,sizeof(visit));///清空上次搜索时的标记
if(dfs(i)) ///从节点i尝试扩展
sum++;
}
printf("%d\n",sum);
}
void build()
{
int r = -, c = -;
repu(i,,n+)
{
bool flag = true;
repu(j,,m+)
{
if(g[i][j] == )
{
///如果没有障碍物,说明一个机器人就可以解决,否则就得加一个机器人
if(flag)
++r;
Map[i][j].first = r;
flag = false;
}
if(g[i][j] == )
flag = true;
}
}
repu(j,,m+)
{
bool flag = true;
repu(i,,n+)
{
if(g[i][j] == )
{
if(flag) ++c;
Map[i][j].second = c;
flag = false;
}
if(g[i][j] == ) flag = true;
}
}
X = r + ;
repu(i,,n+)
repu(j,,m+)
if(g[i][j] == )
{
addedge(Map[i][j].first,Map[i][j].second);
cout<<Map[i][j].first<<"--"<<Map[i][j].second<<endl;
}
}
void init()
{
int a, x, y;
memset(g, , sizeof(g));
scanf("%d%d%d", &n, &m, &a);
while(a--)
{
scanf("%d%d", &x, &y);
g[x][y] = ;
}
scanf("%d", &a);
while(a--)
{
scanf("%d%d", &x, &y);
g[x][y] = ;
}
}
///和POJ 3041的区别就是有障碍物
///因为有障碍物,所以需要进行行列拆分。。。即build
int main()
{
int T,a,b,x,y,l,r;
scanf("%d",&T);
while(T--)
{
memset(head,,sizeof(head)); ///切记要初始化
index = ;
init();
build();
MaxMatch();
}
return ;
}
UVA 12549 - 二分图匹配的更多相关文章
- UVa 二分图匹配 Examples
这些都是刘汝佳的算法训练指南上的例题,基本包括了常见的几种二分图匹配的算法. 二分图是这样一个图,顶点分成两个不相交的集合X , Y中,其中同一个集合中没有边,所有的边关联在两个集合中. 给定一个二分 ...
- POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups / HDU 1699 Jamie's Contact Groups / SCU 1996 Jamie's Contact Groups (二分,二分图匹配)
POJ 2289 Jamie's Contact Groups / UVA 1345 Jamie's Contact Groups / ZOJ 2399 Jamie's Contact Groups ...
- uva 12083 Guardian of Decency (二分图匹配)
uva 12083 Guardian of Decency Description Frank N. Stein is a very conservative high-school teacher. ...
- UVA 1663 Purifying Machine (二分图匹配,最大流)
题意: 给m个长度为n的模板串,模板串由0和1和*三种组成,且每串至多1个*,代表可0可1.模板串至多匹配2个串,即*号改成0和1,如果没有*号则只能匹配自己.问:模板串可以缩减为几个,同样可以匹配原 ...
- UVA 11045-My T-shirt suits me(二分图匹配)
题意:有N件T恤,N是6的倍数,因为有6种型号,每种件数相同,有M个人,每个人有两种型号的T恤适合他,每个人可以挑其中的一种,问能否所有的人都能分配到T恤. 解析:典型的二分图匹配,每N/6为同种T恤 ...
- uva 12549
12549 - Sentry Robots Time limit: 1.000 seconds We need to guard a set of points of interest using s ...
- POJ 1274 裸二分图匹配
题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...
- BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配
1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2375 Solved: 1005[Submit][Sta ...
- HDU1281-棋盘游戏-二分图匹配
先跑一个二分图匹配,然后一一删去匹配上的边,看能不能达到最大匹配数,不能这条边就是重要边 /*----------------------------------------------------- ...
随机推荐
- 实现远程FTP特定时间轨道号MODIS数据的搜索
private ArrayList alst = new System.Collections.ArrayList();//建立ArrayList对象 int strLength = 0; strin ...
- zend studio 9 字体,颜色,快捷键等相关设置
1.zend studio 9可以破解吗? 可以的,具体破解步骤查看:http://www.geekso.com/ZendStudio9-key/ 2.如何将zend studio 9的默认GBK编码 ...
- Java List合并去重
List A和B A.removeAll(B); A.addAll(B); 例如有如下实体类: /** * hashset是如何保持元素的唯一性呢? * 是通过元素的hashcode和equals来表 ...
- JAVA 多线程随笔 (三) 多线程用到的并发容器 (ConcurrentHashMap,CopyOnWriteArrayList, CopyOnWriteArraySet)
1.引言 在多线程的环境中,如果想要使用容器类,就需要注意所使用的容器类是否是线程安全的.在最早开始,人们一般都在使用同步容器(Vector,HashTable),其基本的原理,就是针对容器的每一个操 ...
- [原创]WPF资源Binding自定义集合类。
简单介绍一下Wpf资源字典: 每个WPF界面元素都有一个名为Resource的属性,这个属性继承至FrameworkElement类,其类型为ResourceDictionary.ResourceDi ...
- EF6 CodeFirst+Repository+Ninject+MVC4+EasyUI实践(完)
前言 这一篇是本系列的最后一篇,虽然示例讲到这里就停止呢,但对于这些技术的学习远不能停止.虽然本示例讲的比较基础,但是正如我第一篇说到的,这个系列的目的不是说一些高端的架构设计,而是作为一个入门级,对 ...
- Linux 设备驱动程序 proc
不能再简化了 #include<linux/module.h> #include<linux/init.h> #include<linux/proc_fs.h> i ...
- Bootstrap学习笔记(二)
这一节笔记主要记录排版内容笔记,其内容包括标题.文本(包括段落.粗斜体.对齐).列表.表格等. 一.标题 在bootstrap中H1-H6与非框架版的区别不大,需要注意的是<small>标 ...
- curl获取远程图片存到本地
$url = 'http://sssss/sss/xu0fLo9waqKSTDO7j0kSO41O5Luq3LB6ozUvY4O7OsXUWNicB49fBs8nGYzoqcwGDARQZHpVuic ...
- doctype声明的重要性-------这绝对是ie的坑, 与angular无关, 我错怪你啦
今天开发一个页面, 自己写页面, 自己实现功能. 因为以往需求都没有要求兼容ie9, 所以并未发现此坑. 今天就记录下来. 贴图对比 ie9 chrome 如图, ie9界面显示错误. 起初以为是a ...