<题目链接>

题目大意:

这题意思是给出一张图,图中'X'表示wall,'.'表示空地,可以放置炮台,同一条直线上只能有一个炮台,除非有'X'隔开,问在给出的图中最多能放置多少个炮台。

解题分析:

本题可用DFS求解 >>> ,但是二分匹配的想法更加巧妙,效率也更高。二分匹配的主要思想就是,对矩阵的行连通块和列连通块进行标号,然后根据矩阵的每个点,建立对应的行连通块和列连通块之间的匹配关系,然后利用匈牙利进行正式匹配,这样当某个行联通块与某个列连通块正式确立匹配关系的时候,说明这两个连通块的交点坐标(之一)放碉堡,而它们的其它部分则不能放碉堡。

 #include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int nrow,ncol;
int g[][],linker[];
bool used[];
char map[][];
int maprow[][],mapcol[][];
bool dfs(int u){
for(int v=;v<=ncol;v++)
if(g[u][v]&&!used[v]){
used[v]=true;
if(!linker[v]||dfs(linker[v])){
linker[v]=u;
return true;
}
}
return false;
}
int Hungary(){
int res=;
memset(linker,,sizeof(linker)); //将行连通块的归属全部置为空
for(int u=;u<=nrow;u++){
memset(used,,sizeof(used));
if(dfs(u))res++;
}
return res;
}
int main(){
int i,j,n;
while(scanf("%d",&n),n){
memset(mapcol,,sizeof(mapcol));
memset(maprow,,sizeof(maprow));
memset(g,,sizeof(g));
for(i=;i<=n;i++){
for(j=;j<=n;j++){
cin>>map[i][j];
if(map[i][j]=='X')
mapcol[i][j]=maprow[i][j]=-; //X点的行连通编号和列连通编号均标为-1
}
}
int p1=;
nrow=;ncol=;
//给行编号
for(i=;i<=n;i++){
for(j=;j<=n;j++){
while(maprow[i][j]==-&&j<=n) //跳过这一行的X部分
j++;
p1++; //p1代表序号
while(maprow[i][j]!=-&&j<=n){
maprow[i][j]=p1; //给第i行连续的连通块打上相同标号p1
if(nrow<p1) nrow=p1; //记录所有行中,行联通块的最大编号
j++;
}
}
}
int p2=;
//给列编号
for(j=;j<=n;j++)
for(i=;i<=n;i++){
while(mapcol[i][j]==-&&i<=n) //遍历第j列的时候,跳过X部分
i++;
p2++;
while(mapcol[i][j]!=-&&i<=n){
mapcol[i][j]=p2; //给第j列的连续的联通块标上相同的序号
if(ncol<p2)ncol=p2; //记录下所有列中,列连通块的最大标号
i++;
}
}
for(i=;i<=n;i++)
for(j=;j<=n;j++){
if(maprow[i][j]!=-&&mapcol[i][j]!=-)
g[maprow[i][j]][mapcol[i][j]]=; //将每个空格点的行连通标号与列连通标号 构建匹配关系
}
printf("%d\n",Hungary());
}
return ;
}

2018-11-10

HDU 1045 Fire Net 【二分图匹配】的更多相关文章

  1. hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏

    题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...

  2. HDU 1045 Fire Net 二分图建图

    HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...

  3. hdu 1045 Fire Net(二分匹配 or 暴搜)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  4. HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)

    (点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...

  5. HDU 1045 Fire Net(行列匹配变形+缩点建图)

    题意:n*n的棋盘上放置房子.同一方同一列不能有两个,除非他们之间被墙隔开,这种话. 把原始图分别按行和列缩点 建图:横竖分区.先看每一列.同一列相连的空地同一时候看成一个点,显然这种区域不可以同一时 ...

  6. HDOJ(HDU).1045 Fire Net (DFS)

    HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...

  7. HDU 1045 Fire Net 【连通块的压缩 二分图匹配】

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others)    ...

  8. hdu 1045 Fire Net(二分图)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击, ...

  9. HDU 1045(Fire Net)题解

    以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...

  10. HDU1045:Fire Net(二分图匹配 / DFS)

    Fire Net Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

随机推荐

  1. day 08字符编码 文件处理

    字符编码1.软件启动流程(打开notepad++文档)从硬盘将软件加载到内存上加载test.txt到内存中执行notepad++的代码,将test.txt打到屏幕上 python解释器也是一个应用软件 ...

  2. 《剑指offer》 二进制中1的个数

    本题来自<剑指offer> 二进制中1的个数 题目: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 思路: 两种思路: 第一种:对n进行左移,检测最后一位是否为1,但考 ...

  3. 《剑指offer》从尾到头打印链表

    本题来自<剑指offer> 从尾到头打印链表 题目: 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 思路: 方案一:首先遍历到尾部,然后从尾部进行到头值进行操作,后进先 ...

  4. 网络扫描信息收集基于(Windows)

    1.首先说明一下一款网络扫描工具,在之前的博客中我曾简要的写过关于Advance IP Scanner使用方法,最近要写网络扫描的工具,所以对这款工具做一个详细的功能细节上的介绍. 如下图  在输入框 ...

  5. FFmpeg 常用指令集合

    不精确裁剪视频 # -ss 指定从什么时间开始 # -t 指定需要截取多长时间 # -i 指定输入文件 ffmpeg -ss 00:00:00 -t 00:00:30 -i test.mp4 -vco ...

  6. shell设置连接服务器永不超时

    1.打开/etc/ssh/sshd_config vim /etc/ssh/sshd_config   2.设置如下内容: MaxAuthTries 60 MaxSessions 3 ClientAl ...

  7. C++ Primer 笔记——运行时类型识别

    1.dynamic_cast运算符的使用形式如下: dynamic_cast<type*>(e) // e必须是一个有效指针 dynamic_cast<type&>(e ...

  8. Hyper-V 替换 vmwp

    要激活 Hyper-V 下的虚机 最简单的方法是用带证书的vmwp替换掉原来的 带证书的vmwp参见:http://bbs.pcbeta.com/viewthread-1408240-1-1.html ...

  9. Ubuntu 16.04 卸载Postgresql

    首先确保postgresql是否在运行,在命令窗口输入 netstat -nlt han@han-OptiPlex-:~/project/0_ng_practice/ng-test$ netstat ...

  10. CentOS7安装MySQL并设置远程登录

    在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB. 1 下载并安装MySQL官方的 Yum Re ...