Antenna Placement poj 3020(匹配)
http://poj.org/problem?id=3020
题意:给定一个n*m的矩阵,'*'代表城市,现在想要用1*2的矩阵将所有的城市覆盖,问最少需要多少个矩阵?
分析:先为每个城市进行标号,再构建图,用匈牙利算法算出最大匹配。由于这里面用了双向边进行构图,所以最终所求答案为点集数-匹配数/2.
点集数-匹配数/2 = 点集数-匹配数/2*2+匹配数/2(单独的一个点的+匹配成功的点/2)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath>
#include<vector>
#include<queue>
#include<algorithm> using namespace std;
typedef long long LL; const int maxn=;
const int INF=0x3f3f3f3f;
const int mod=;
int dir[][]={{,},{,},{-,},{,-}};
char maps[maxn][maxn];
int G[maxn][maxn],a[maxn][maxn], v[maxn], used[maxn];
int p, n, m; int Hungary(int x)
{
for(int i=; i<=p; i++)
{
if(!v[i] && G[x][i])
{
v[i]=;
if(!used[i] || Hungary(used[i]))
{
used[i] = x;
return ;
}
}
}
return ;
} int OK(int x, int y)
{
if(x>= && x<n && y>= &&y<m && maps[x][y]=='*')
return ;
return ;
} int main()
{
int T; scanf("%d", &T); while(T --)
{
scanf("%d %d", &n, &m); for(int i=; i<n; i++)
scanf("%s", maps[i]); memset(G, , sizeof(G));
memset(a, , sizeof(a)); p = ; for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
{
if(maps[i][j]=='*')
a[i][j]=++p;
}
} for(int i=; i<n; i++)
{
for(int j=; j<m; j++)
{
if(maps[i][j]=='*')
{
for(int k=; k<; k++)
{
int nx = dir[k][]+i;
int ny = dir[k][]+j; if(OK(nx, ny))
{
G[a[i][j]][a[nx][ny]] = ;
G[a[nx][ny]][a[i][j]] = ;
}
}
}
}
} int ans = ;
memset(used, , sizeof(used));
for(int i=; i<=p; i++)
{
memset(v, , sizeof(v));
if(Hungary(i))
ans ++;
} printf("%d\n", p-ans/);
}
return ;
}
Antenna Placement poj 3020(匹配)的更多相关文章
- Antenna Placement poj 3020
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 12104 Accepted: 595 ...
- Antenna Placement POJ - 3020 (最小边集覆盖)
Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 10699 Accepted: 526 ...
- (匹配 二维建图) Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- (匹配)Antenna Placement --POJ --3020
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82834#probl ...
- Antenna Placement POJ - 3020 二分图匹配 匈牙利 拆点建图 最小路径覆盖
题意:图没什么用 给出一个地图 地图上有 点 一次可以覆盖2个连续 的点( 左右 或者 上下表示连续)问最少几条边可以使得每个点都被覆盖 最小路径覆盖 最小路径覆盖=|G|-最大匹配数 ...
- POJ 3020 Antenna Placement【二分匹配——最小路径覆盖】
链接: http://poj.org/problem?id=3020 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...
- POJ3020:Antenna Placement(二分图匹配)
Antnna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11093 Accepted: 5459 ...
- poj 3020 Antenna Placement(最小路径覆盖 + 构图)
http://poj.org/problem?id=3020 Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Sub ...
- 二分图最大匹配(匈牙利算法) POJ 3020 Antenna Placement
题目传送门 /* 题意:*的点占据后能顺带占据四个方向的一个*,问最少要占据多少个 匈牙利算法:按坐标奇偶性把*分为两个集合,那么除了匹配的其中一方是顺带占据外,其他都要占据 */ #include ...
随机推荐
- Python中获取字典中最值对应的键
利用min(dict, key=dict.get) >>> d = {1:1, 2:0, 3:2} {1: 1, 2: 0, 3: 2} >>> min(d, ke ...
- morhia解决BigDecimal映射问题
错误信息:morphia No usable constructor for java.math.BigDecimal 解决办法:增加自定义类型转换器,代码如下 package cn.huilink. ...
- [zz] Pixar’s OpenSubdiv V2: A detailed look
http://www.fxguide.com/featured/pixars-opensubdiv-v2-a-detailed-look/ Pixar’s OpenSubdiv V2: A detai ...
- StringIO学习
StringIO StringIO的行为与file对象非常像,但它不是磁盘上文件,而是一个内存里的“文件”,我们可以将操作磁盘文件那样来操作StringIO.一个简单的例子,让你对StringIO有一 ...
- (转)创建Graphics的三种方法
方法一.利用控件或窗体的Paint事件中的PainEventArgs 在窗体或控件的Paint事件中接收对图形对象的引用,作为PaintEventArgs(PaintEventArgs指定绘制控件所用 ...
- switch语句
应用条件语句可以很方便地使程序实现分支,但是出现分支比较多的时候,虽然可以用嵌套的if语句来解决,但是程序结构会显得复杂,甚至凌乱.为方便实现多情况选择,C++提供了一种switch开关语句. 一 ...
- PaintCode调研
1. 背景 PaintCode是一款面向iOS和Mac应用开发者及设计师的矢量图形可视化开发工具.它可以让设计师把设计好的psd文件直接导入该工具,然后生成用Quartz 2D 产生的object ...
- div背景图片叠加
.box1{ width: 500px; height: 500px; background: url("")no-repeat,url("")no ...
- The listener supports no services解决一例
The listener supports no services解决一例 Listener动态监听静态监听注册实例 今天做Advacned Replication实验的时候碰到一个问题,启动目标 ...
- JMeter压力测试以文件的形式
JMeter压力测试入门教程[图文] 1. 下载JMeter 2. 启动JMeter 3. 运行预准备 4. 运行 文章目录 Apache JMeter是Apache组织开发的基于Java的压力测试工 ...