题意就不说了,求二部图最大匹配。

问题是怎么建图……

给定的条件中,h<40,w<10,所以笔者直接默认所有情况的地图都是40*10,当然,超出范围的便是空城o。

然后给城市编号。一个城市只能和上下左右4个城市公用天线。换个换说就像国际象棋的棋盘一样,黑色格子与白色格子自然分成了二部图。黑色只能和白色匹配。

编号也很简单了。从第一行开始,第一格是黑色城市1,然后白色城市1,然后黑色城市2,白色城市2……因为所有的图都默认一样大小,所以编号可以重用。

为了方便知道(i,j)到底是黑色还是白色,我们可以用正数编号表示黑色,负数编号表示白色。

然后求最大匹配,直接匈牙利过去就好了。

贴代码,0MS

#include <cstdio>
#include <cstring> const int maxn=;
bool mp[maxn][maxn];
bool vis[maxn];
int link[maxn];
int No[][];
int n; bool DFS(int x)
{
for(int y=;y<=n;y++)
{
if(mp[x][y] && !vis[y])
{
vis[y]=true;
if(link[y]== || DFS(link[y]))
{
link[y]=x;
return true;
}
}
}
return false;
} int maxMartch()
{
int count=;
for(int x=;x<=n;x++)
{
memset(vis,,sizeof(vis));
if(DFS(x))
count++;
}
return count;
} int main()
{
int T;
scanf("%d",&T); int index=;
for(int i=;i<;i++)
for(int j=;j<;j++,index++)
No[i][j]=(index/)*((index+i)%?-:);
n=; while(T--)
{
int num=;
int w,h;
scanf("%d%d",&h,&w);
if(w%)
w++; char str[][];
memset(mp,,sizeof(mp));
memset(link,,sizeof(link));
memset(str,,sizeof(str));
for(int i=;i<h;i++)
{
scanf("%s",str[i&]);
if(str[i&][]=='*')
{
num++;
if(str[-i&][]=='*')
{
if(No[i][]>)
mp[No[i][]][-No[i-][]]=true;
else
mp[No[i-][]][-No[i][]]=true;
}
}
for(int j=; j<w; j++)
{
if(str[i&][j]=='*')
{
num++;
if(str[i&][j-]=='*')
{
if(No[i][j]>)
mp[No[i][j]][-No[i][j-]]=true;
else
mp[No[i][j-]][-No[i][j]]=true;
} if(str[-i&][j]=='*')
{
if(No[i][j]>)
mp[No[i][j]][-No[i-][j]]=true;
else
mp[No[i-][j]][-No[i][j]]=true;
}
}
}
}
printf("%d\n",num-maxMartch());
}
}

整个建图是自己想的,好像略似繁琐……不过还好,比赛的时候估计也能这么想到吧。

POJ 3020 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 ...

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

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

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

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

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

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

  6. POJ 3020 Antenna Placement

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

  7. poj 3020 Antenna Placement (最小路径覆盖)

    链接:poj 3020 题意:一个矩形中,有n个城市'*'.'o'表示空地,如今这n个城市都要覆盖无线,若放置一个基站, 那么它至多能够覆盖本身和相邻的一个城市,求至少放置多少个基站才干使得全部的城市 ...

  8. POJ 3020 Antenna Placement 最大匹配

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

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

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

随机推荐

  1. Java实战之02Hibernate-02映射、一级缓存、实体对象状态

    五.映射基础 1.实体类采用javabean的编写规范 JavaBean编写规范: a.类一般是public的 b.有默认的构造方法 c.字段都是私有的 d.提供公有的getter和setter方法 ...

  2. 初学C++,开博第一篇

    几个维度相同的数组转置算法,这两种完全相同://注意:如果维度不同,转置会出错误,因为下标会越界...解决办法是把数组的维度调齐,或者是写到另一新数组中. for(int i=0;i<row;i ...

  3. 九度OJ 1501 最大连续子序列乘积 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1501 题目描述: 给定一个浮点数序列(可能有正数.0和负数),求出一个最大的连续子序列乘积. 输入: 输入可能包含 ...

  4. 伪分布式环境下命令行正确运行hadoop示例wordcount

    首先确保hadoop已经正确安装.配置以及运行. 1.     首先将wordcount源代码从hadoop目录中拷贝出来. [root@cluster2 logs]# cp /usr/local/h ...

  5. C#语法需要注意的地方

    笔试中遇到的一些C#语法方面的问题,由于平时很少用到,笔试的时候模棱两可,现在做一个笔记. using System; using System.Collections.Generic; using ...

  6. C#与.NET

    1 .NET Framework的核心是其运行库执行环境,即公共语言运行库(CLR)或.NET运行库,一般将CLR控制下运行的代码称为托管代码(managed code). 在CLR在执行编写好的代码 ...

  7. js设置cookie过期及清除浏览器对应名称的cookie

    js设置cookie过期也就相当于清除浏览器对应名称的cookie的例子. 代码: function ClearCookie() {  var expires = new Date();  expir ...

  8. windows 系统下,小数据量Oracle用户物理备份

    环境:windows Server 2003 oracle 10g,系统间备份 目标系统创建共享文件,原系统挂载共享目录 写批处理脚本,用任务计划定时调用 Rem * 由于系统实时性要求不是很高,数据 ...

  9. ubuntu10.04搭建嵌入式开发环境

    改源 配置vim set number set autoindent set smartindent set tabstop=4 set incsearch 安装g++ 配置samba 1.先安装程序 ...

  10. C语言自带的快速排序(qsort)函数使用方法

    感觉打快排太慢了,找到了c语言自带的函数.这函数用起来没c++的方便,不过也够了. 函数名称:qsort,在头文件:<stdlib.h>中 不多说,上代码: #include <st ...