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

问题是怎么建图……

给定的条件中,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 泛型 窜讲

    一.为什么使用泛型      复用性:泛型的本质就是参数化类型,因而使用编写的泛型代码可以被许多不同类型的对象所复用.      安全性:在对类型Object引用的参数操作时,往往需要进行显式的强制类 ...

  2. js方法的命名不能使用表单元素的名称或ID

    今天在写页面的时候,遇到一个关于js方法的命名问题,先看下代码: 表单元素如下: <select name="isCulture" onchange="isCult ...

  3. docker+tomcat+java配置(ubuntu)

    原创文章,转载请注明出处. 本文是基于ubuntu14.04搭建的dosker,tomcat配置是在docker容器外面(为了方便查看日志)使用的是docker启动挂载,该tomcat工程依赖于doc ...

  4. 把DataSet转换成JSON

    /// <summary> /// dataTable转换成Json格式 /// </summary> /// <param name="dt"> ...

  5. php文本操作方法集合

    fgets和fputs.fread和fwrite.fscanf和fprintf 字符串读写函数fgets和fputs  一.读字符串函数fgets函数的功能是从指定的文件中读一个字符串到字符数组中,函 ...

  6. php 时间函数参考

    time()在PHP中是得到一个数字,这个数字表示从1970-01-01到现在共走了多少秒,很奇怪吧 不过这样方便计算, 要找出前一天的时间就是 time()-60*60*24; 要找出前一年的时间就 ...

  7. Python 基础篇:字典、集合、文件操作

    字典 字典一种key - value 的数据类型 1. 语法: info = { 'stu1101': "TengLan Wu", 'stu1102': "LongZe ...

  8. 机器学习实战——k-近邻算法

    本章内容 ================================ (一)什么是k-近邻分类算法 (二)怎样从文件中解析和导入数据 (三)使用Matplotlib创建扩散图 (四)对数据进行归 ...

  9. Python自省学习

    1. 访问对象的属性 class MyClass(): a=' b=' def __init__(self): pass def write(self): print self.a,self.b my ...

  10. Codeforces 55D Beautiful Number

    Codeforces 55D Beautiful Number a positive integer number is beautiful if and only if it is divisibl ...