POJ 3020 -Antenna Placement-二分图匹配
题意:一个N*M的矩阵里有K个观测点,你必须放置天线覆盖所有观测点。每个雷达只能天线两个观测点,这两点必须相邻。计算最少天线数。
做法:将所有相邻的观测点连起来,建图。跑一遍匈牙利算法就计算出了最大的覆盖数,除以二就是天线数。还要加上落单的观测点,每个都需要一个天线。
- /*--------------------------------------------------------------------------------------*/
- // Helica's header
- // Second Edition
- // 2015.11.7
- //
- #include <algorithm>
- #include <iostream>
- #include <cstring>
- #include <ctype.h>
- #include <cstdlib>
- #include <cstdio>
- #include <vector>
- #include <string>
- #include <queue>
- #include <stack>
- #include <cmath>
- #include <set>
- #include <map>
- //debug function for a N*M array
- #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
- {for(int j=;j<(M);j++){\
- printf("%d",G[i][j]);}printf("\n");}
- //debug function for int,float,double,etc.
- #define debug_var(X) cout<<#X"="<<X<<endl;
- /*--------------------------------------------------------------------------------------*/
- using namespace std;
- const int maxn = ;
- int N,M,T;
- int G[*maxn][*maxn],Map[maxn][maxn];
- int dx[]={,-,,},dy[]={,,,-};
- int linker[*maxn];
- bool used[*maxn];
- int uN,vN;
- bool dfs(int u)
- {
- for(int v=;v<=vN;v++)
- {
- if(G[u][v] && !used[v])
- {
- used[v] = true;
- if(linker[v] == - || dfs(linker[v]))
- {
- linker[v] = u;
- return true;
- }
- }
- }
- return false;
- }
- int hungary()
- {
- memset(linker,-,sizeof linker);
- int res = ;
- for(int u=;u<=uN;u++)
- {
- memset(used,false,sizeof used);
- if(dfs(u)) res++;
- }
- return res;
- }
- int main()
- {
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%d",&N,&M);
- char c;
- uN = ;
- for(int i=;i<N;i++)
- {
- getchar();
- for(int j=;j<M;j++)
- {
- scanf("%c",&c);
- if(c == '*') Map[i][j] = ++uN;
- else Map[i][j] = ;
- }
- }
- memset(G,,sizeof G);
- vN = uN;
- for(int i=;i<N;i++)
- {
- for(int j=;j<M;j++) if(Map[i][j])
- {
- int u = Map[i][j];
- for(int p=;p<;p++)
- {
- int nx = i+dx[p],ny = j+dy[p];
- if(nx >= && nx < N && ny >= && ny < M)
- {
- if(int v = Map[nx][ny])
- {
- //printf("u:%d v:%d\n",u,v);
- G[u][v] = G[v][u] = ;
- }
- }
- }
- }
- }
- int ans = hungary();
- //printf("ans:%d uN:%d\n",ans,uN);
- printf("%d\n",(uN-ans)+ans/);
- }
- }
POJ 3020 -Antenna Placement-二分图匹配的更多相关文章
- POJ - 3020 Antenna Placement 二分图最大匹配
http://poj.org/problem?id=3020 首先注意到,答案的最大值是'*'的个数,也就是相当于我每用一次那个技能,我只套一个'*',是等价的. 所以,每结合一对**,则可以减少一次 ...
- [POJ] 3020 Antenna Placement(二分图最大匹配)
题目地址:http://poj.org/problem?id=3020 输入一个字符矩阵,'*'可行,'o'不可行.因为一个点可以和上下左右四个方向的一个可行点组成一个集合,所以对图进行黑白染色(每个 ...
- POJ 3020 Antenna Placement(二分图 匈牙利算法)
题目网址: http://poj.org/problem?id=3020 题意: 用椭圆形去覆盖给出所有环(即图上的小圆点),有两种类型的椭圆形,左右朝向和上下朝向的,一个椭圆形最多可以覆盖相邻的两 ...
- POJ 3020 Antenna Placement (二分图最小路径覆盖)
<题目链接> 题目大意:一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,每放置一个基站,至多可以覆盖相邻的两个城市.问至少放置多少个基站才能使得所有的城市都覆盖无线? 解题分析: ...
- 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement
题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...
- poj 3020 Antenna Placement(最小路径覆盖 + 构图)
http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- POJ 3020 Antenna Placement 【最小边覆盖】
传送门:http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total ...
- 【POJ 3020】Antenna Placement(二分图匹配)
相当于用1*2的板覆盖给定的h*w的格子里的点,求最少的板.可以把格子相邻的分成两个集合,如下图,0为一个集合,1的为一个,也就是(行数+列数)为奇数的是一个集合,为偶数的为另一个集合.1010101 ...
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ 3020 Antenna Placement 最大匹配
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6445 Accepted: 3182 ...
随机推荐
- 【C#复习总结】细说 Lambda表达式
1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...
- [书籍]用UWP复习《C#并发编程经典实例》
1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...
- socketserver + ftp
--------------------------------------------生活不止眼前的苟且,还有诗和远方的田野. day 29 socketserver + ftp # # ----- ...
- POJ - 2528 区间离散化,线段树区间修改,区间询问
这个题非常有意思的地方是,我们发现区间[1,4]和[5,8]是紧挨着的,因为这个的数代表的是一段区间,原本我们对于普通的离散, a[1]=1,a[2]=5,a[3]=6,a[4]=8;数组下标就是重新 ...
- hibernate在写cfg配置文件自动创建表时报错org.hibernate.MappingException: Could not get constructor for org.hibernate.persister.entity.SingleTableEntityPersister
在用hibernate框架时,写cfg文件,想自动生成表时,一般写<property name="hibernate.hbm2ddl.auto">create</ ...
- mysql 查看版本
查看mysql版本的四种方法 - 风生水起 - 博客园 http://www.cnblogs.com/end/archive/2011/10/18/2216461.html 查看mysql数据库版本方 ...
- 如何入门vue之一
入门vue 首先从vue的指令开始学起. vue的指令: v-if 根据是否得到的布尔值进行是否显示. v-show:根据是否得到的布尔值是否显示.不同的地方在于隐藏是style隐藏. v-on 监 ...
- oracle服务端安装与配置
从oracle官网下载oracle服务端的安装包. 下载下来是两个压缩文件,两个压缩文件都解压(缺一不可)到同一目录下,最后会得到一个database文件夹. 双击database文件夹下的setup ...
- java lang(Comparable接口) 和java util(Comparator接口)分析比较
//Comparable 接口强行对实现它的每个类的对象进行整体排序. -- 自然排序.类的compareTo称为自然比较方法. public interface Comparable<T> ...
- Spark源码编译,官网学习
这里以spark-1.6.0版本为例 官网网址 http://spark.apache.org/docs/1.6.0/building-spark.html#building-with-build ...