题目网址:  http://poj.org/problem?id=3020

题意:

用椭圆形去覆盖给出所有环(即图上的小圆点),有两种类型的椭圆形,左右朝向和上下朝向的,一个椭圆形最多可以覆盖相邻的两个小圆点。

 

思路:

将每个小圆点看作是一个顶点,因为一个椭圆只能覆盖两个小圆点,我们就可以把这个图看成一个二分图。将相邻的两个点,一个看作是X集合内顶点,另一个看成是Y集合内顶点。但要注意的是一个顶点可能不止和一个顶点想连(如上图情况),所以我们要把上述情况看作是一个无向图,而不是有向图。因为是无向图,所以最大匹配数要除以二。

这样我们就把问题转换成求最小边覆盖:即用最小的边将所有顶点覆盖。该值会等于 顶点数-最大匹配数。 至于求二分图的最大匹配数,直接用匈牙利算法即可。

代码:

 #include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
int match[];
struct node{
int x,y;
}dir[]={{,},{-,},{,},{,-}};
vector<node>v;
int n,m,cnt;
char matrix[][];
int mp[][];
int book[];
int e[][];
void deal(){
for (int x=; x<n; x++) {
for (int y=; y<m; y++) {
if(matrix[x][y]!='*') continue;
int i=mp[x][y];
for (int d=,xx,yy; d<; d++) {
xx=x+dir[d].x;
yy=y+dir[d].y;
if(xx< || x>=n || yy< || yy>=m || matrix[xx][yy]!='*') continue;
int j=mp[xx][yy];
e[i][j]=; }
}
}
}
int dfs(int u){
for(int i=;i<=cnt;i++){
if(!book[i] && e[u][i]){
book[i]=;
if(match[i]== || dfs(match[i])){
match[i]=u;
return ;
}
}
}
return ;
}
int main(){
int t;
scanf("%d",&t);
while (t--) {
int sum=;
cnt=;
v.clear();
memset(match, , sizeof(match));
memset(mp, , sizeof(mp));
memset(e, , sizeof(e));
scanf("%d%d ",&n,&m);
for (int i=; i<n; i++) {
gets(matrix[i]);
for (int j=; j<m; j++) {
if(matrix[i][j]=='*'){
mp[i][j]=++cnt;
}
}
}
deal();
for (int i=; i<=cnt; i++) {
memset(book, , sizeof(book));
if(dfs(i)) sum++;
}
printf("%d\n",cnt-sum/);
}
return ;
}

POJ 3020 Antenna Placement(二分图 匈牙利算法)的更多相关文章

  1. [POJ] 3020 Antenna Placement(二分图最大匹配)

    题目地址:http://poj.org/problem?id=3020 输入一个字符矩阵,'*'可行,'o'不可行.因为一个点可以和上下左右四个方向的一个可行点组成一个集合,所以对图进行黑白染色(每个 ...

  2. POJ - 3020  Antenna Placement 二分图最大匹配

    http://poj.org/problem?id=3020 首先注意到,答案的最大值是'*'的个数,也就是相当于我每用一次那个技能,我只套一个'*',是等价的. 所以,每结合一对**,则可以减少一次 ...

  3. POJ 3020 Antenna Placement (二分图最小路径覆盖)

    <题目链接> 题目大意:一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,每放置一个基站,至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 解题分析: ...

  4. 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement

    题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...

  5. poj 3020 Antenna Placement(最小路径覆盖 + 构图)

    http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Sub ...

  6. POJ 3020 Antenna Placement 【最小边覆盖】

    传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total ...

  7. poj 3020 Antenna Placement(二分无向图 匈牙利)

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6438   Accepted: 3176 ...

  8. POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】

    链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  9. POJ 3020——Antenna Placement——————【 最小路径覆盖、奇偶性建图】

    Antenna Placement Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u S ...

随机推荐

  1. celery详解

    目录 Celery详解 1.背景 2.形象比喻 3.celery具体介绍 3.1 Broker 3.2 Backend 4.使用 4.1 celery架构 4.2 安装redis+celery 4.3 ...

  2. Recovery启动流程(2)---UI界面【转】

    Recovery启动流程系列文章把recvoery目录下文件分成小块讲解,最后再以一条主线贯穿所有的内容.这篇文章主要讲解Recovery-UI的相关内容. 我们知道,当我们通过按键或者应用进入rec ...

  3. 使用CoordinatorLayout打造各种炫酷的效果

    使用CoordinatorLayout打造各种炫酷的效果 自定义Behavior -- 仿知乎,FloatActionButton隐藏与展示 NestedScrolling 机制深入解析 一步步带你读 ...

  4. [C++] C++中的宏定义详解

    转载自:C++中的宏定义 和 C++宏定义详解 一.#define解析     #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率 ...

  5. 03爬虫-requests模块基础(1)

    requests模块基础 什么是requests模块 requests模块是python中原生基于网络模拟浏览器发送请求模块.功能强大,用法简洁高效. 为什么要是用requests模块 用以前的url ...

  6. SpringBootSecurity学习(01)网页版登录入门介绍

    Web应用安全管理 Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.权限管理的设计一般使用角色 ...

  7. Spring MVC-从零开始-EL(未完待续)

    Spring MVC-从零开始-EL(未完待续)

  8. jenkins+ant构建项目时候build.xml需要改动的地方说明

    上一节将build.xml文件代码列出来了,这一节给出说明,要想使用该文件,需要变更的地方有哪些.

  9. 使用gtest(googletest)进行c++单元测试

    这是系列文章的第三篇,前两篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/1158 ...

  10. kotlin系列文章 --- 3.条件控制

    if表达式 一个if语句包含一个布尔表达式和一条或多条语句 // 基础用法 var max = a if (a<b) max = b // 加上else var max: Int if(a> ...