二分图匹配求最小边覆盖

建图方法中的黑白染色法,题目中说信号可以覆盖相邻两个块,那么我们可以将给定的地图染成国际象棋棋盘的样子,一个黑格可以与周围的四个白格共用信号,对于城市,从每一个黑格出发,向其周围的白格连边,那么这就是一个二分图,我们的把城市抽象成了点,所以我们的目的是找到最少的边覆盖所有的点,即最小边覆盖。

在二分图中,最小边覆盖=顶点数-最大匹配数。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int init(){
int rv=0,fh=1;
char c=getchar();
while(c<'0'||c>'9'){
if(c=='-') fh=-1;
c=getchar();
}
while(c>='0'&&c<='9'){
rv=(rv<<1)+(rv<<3)+c-'0';
c=getchar();
}
return fh*rv;
}
int T,n,m,g[405][5],rs[50][50],clr[50][50],dx[4]={-1,0,0,1},dy[4]={0,-1,1,0},match[405];
bool f[405];
char ma[50][50];
bool hungarian(int u){
for(int i=1;i<=g[u][0];i++){
int v=g[u][i];
if(!f[v]){
f[v]=1;
if(!match[v]||hungarian(match[v])){
match[v]=u;
return 1;
}
}
}
return 0;
}
int main(){
T=init();
while(T--){
n=init();m=init();
memset(ma,0,sizeof(ma));
memset(rs,0,sizeof(rs));
memset(clr,0,sizeof(clr));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(j==1) rs[i][j]=!rs[i-1][j];
else rs[i][j]=!rs[i][j-1];
scanf(" %c ",&ma[i][j]);
}
}
int blk=0,wit=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ma[i][j]=='*'){
if(rs[i][j]) clr[i][j]=++wit;
else clr[i][j]=++blk;
}else clr[i][j]=0;
}
}
memset(g,0,sizeof(g));
memset(match,0,sizeof(match));
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(clr[i][j]&&rs[i][j]){
int u=clr[i][j];
for(int k=0;k<=3;k++){
int x=i+dx[k],y=j+dy[k];
if(clr[x][y]) g[u][++g[u][0]]=clr[x][y];
}
}
}
}
int ans=0;
for(int i=1;i<=wit;i++){
memset(f,0,sizeof(f));
if(hungarian(i)) ans++;
}
cout<<wit+blk-ans<<endl;
//cout<<ans<<endl;
}
}

POJ [P3020] Antenna Placement的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. POJ 3020 Antenna Placement

    Antenna Placement Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5645 Accepted: 2825 Des ...

  7. POJ 3020 Antenna Placement 最大匹配

    Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6445   Accepted: 3182 ...

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

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

  9. POJ 3020 Antenna Placement 匈牙利算法,最大流解法 难度:1

    http://poj.org/problem?id=3020 #include <cstdio> #include <cstring> #include <vector& ...

随机推荐

  1. c#版 K线控件(Stock)

    K线起源于日本米市交易,它的基本用途就是为了寻找"买卖点".股市及期货市场中的K线图的画法包含四个数据,即开盘价.最高价.最低价.收盘价,所有的k线都是围绕这四个数据展开,反映大势 ...

  2. Spark算子--countByKey

    转载请标明出处http://www.cnblogs.com/haozhengfei/p/1633ffc63e2c925e930adadc9528c830.html  countByKey--Actio ...

  3. 逢三退一(boolean数组的使用)

    package com.hanqi.count; // 逢三退一 输出留到最后值的索引; public class Count1 { //主方法 public static void main(Str ...

  4. Lucene学习笔记1(V7.1)

    Lucene是一个搜索类库,solr.nutch和elasticsearch都是基于Lucene.个人感觉学习高级搜索引擎应用程序之前 有必要了解Lucene. 开发环境:idea maven spr ...

  5. CentOS系统下Redis安装和自启动配置的步骤

    相信大家都知道Redis是一个C实现的基于内存.可持久化的键值对数据库,在分布式服务中常作为缓存服务.所以这篇文章将详细介绍在CentOS系统下如何从零开始安装到配置启动服务.有需要的可以参考借鉴. ...

  6. laravel中数据库在哪个文件中配置

    我们使用 mysql 数据库,修改 .env: DB_HOST=localhost DB_DATABASE=laravel DB_USERNAME=root DB_PASSWORD= 在mysql中创 ...

  7. ap web

    apapplication端吧    应用程序端   也C-S架构Cweb网页端   般封装httpservletrequest和httpservletresponse对象处理些操作  b-s架构

  8. Oracle临时表空间组

    Oracle 10g之前,同一用户的多个会话只可以使用同一个临时表空间,因为在给定的时间只有一个临时表空间默认给用户,为了解决这个潜在的瓶颈,Oracle支持临时表空间组即包含多个临时表空间的集合.临 ...

  9. React源码解析:ReactElement

    ReactElement算是React源码中比较简单的部分了,直接看源码: var ReactElement = function(type, key, ref, self, source, owne ...

  10. Fragment禁止预加载

    项目中经常会用到ViewPager+Fragment组合,然而,有一个很让人头疼的问题就是,去加载数据的时候由于ViewPager的内部机制所限制,所以它会默认至少预加载一个. 1.既然说是ViewP ...