Antenna Placement(二分图的最大匹配)
2024-10-01 00:09:46
http://poj.org/problem?id=3020
题意:
一个矩形中,有N个城市'*',现在这n个城市都要覆盖无线,若放置一个基站,它至多可以覆盖相邻的两个城市。
问至少放置多少个基站才能使得所有的城市都覆盖无线?
无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2
#include <stdio.h>
#include <string.h>
const int N=;
int pos[N][N],map[N][N];
int link[N];
bool vis[N];
int dir[][] = {{,-},{,},{,},{-,}};
int n;
int dfs(int x)
{
for (int i = ; i <= n; i++)
{
if (map[x][i]&&!vis[i])
{
vis[i] = true;
if(!link[i]||dfs(link[i]))
{
link[i] = x;
return ;
}
}
}
return ;
}
int main()
{
char ch;
int t,h,w;
scanf("%d",&t);
while(t--)
{
int id = ;
int ans = ;
scanf("%d%d%*c",&h,&w);
memset(pos,,sizeof(pos));
memset(map,,sizeof(map));
memset(link,,sizeof(link));
for(int i = ; i <= h; i++)
{
for (int j = ; j <= w; j++)
{
scanf("%c",&ch);
if (ch=='*')
pos[i][j] = ++id;
}
getchar();
}
for (int i = ; i <= h; i++)
{
for (int j = ; j <= w; j++)
{
if(pos[i][j])
for (int k = ; k < ; k++)
{
int dx = i+dir[k][];
int dy = j+dir[k][];
if(pos[dx][dy])
{
map[pos[i][j]][pos[dx][dy]] = ;
}
}
}
}
n = id;
for (int i = ; i <= n; i++)
{
memset(vis,,sizeof(vis));
if(dfs(i))
ans++;
}
printf("%d\n",n-ans/);//无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2
}
return ;
}
最新文章
- 前端制作动画的几种方式(css3,js)
- 编译器开发系列--Ocelot语言7.中间代码
- read links July-14
- Object类概述
- REST风格URL
- 九幽2015年Q3 WP市场份额细分报告
- 转化率最高的16个WordPress 电子商务主题
- Caffe Ubuntu14.04 64位 的最快安装 (cuda7.5 + cudnn7.0 2016最新)
- MQTT控制---pingreq
- PLSQL:orecal,tnsname简介
- 安卓入门——————简单记账本的开发(二)-点击listview跳转并实现数据的更新
- Java编程的逻辑 (92) - 函数式数据处理 (上)
- (4.8)mysql备份还原——binlog查看工具之show binlog的使用
- python爬虫——跟踪登录过程以及意外的发现(4)
- Shell基础知识(二)
- Linux系统下面crontab选择默认编译器
- Python中模块的发布与安装
- 浅谈cocos2dx(18) 中工厂模式
- c++ 文件共享打开
- 8、String练习题