hdu 1045 Fire Net(二分图)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
题目大意为给定一个最大为4*4的棋盘,棋盘可以放置堡垒,处在同一行或者同一列的堡垒可以相互攻击,在棋盘上也有城墙,可以隔离同一行同一列堡垒的相互攻击,“X”表示有城墙,“ . ”表示空地,问该棋盘最多可以放置多少个堡垒?
此题为二分图匹配问题,但是起初我不知道怎么建图,看题解发现一个规律,同一行同一列的连续空地不能放置两个堡垒,那么同一行同一列的连续空地的交点放置一个堡垒后,该行该列将不能再放置堡垒,这样很容易联想到二分图的性质,那么把连续“行”空地设为l集合,连续的“列”空地设为r集合,也就是说把连续行空地和连续列空地缩点,如果两者在原图中有交点,则可以建边,这样便可以轻易建图了,建图之后跑一下匈牙利算法即可得出答案,其二分图最大匹配数则为该棋盘最多可以放置的堡垒。
AC代码:
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1001;
int visit[maxn];//访问数组
bool g[maxn][maxn];//建立二分图
int match[maxn];//匹配数组
int l,r;//l和r两集合
bool dfs(int u){
// i为建图后r集合的节点 ,u为l集合的节点
for(int i = 1;i<=r;i++){//依次遍历集合r
if(g[u][i] && !visit[i]){//如何u和i之间有边,而且i没有被访问过
visit[i] = true;//标记
if(match[i] == -1 || dfs(match[i])){//如果该i没有匹配过则直接匹配u,
//如果匹配过那么尝试dfs寻找增广路
match[i] = u;
return true;
}
}
}
return false;
}
int hungary(){
int ans = 0;
memset(match,-1,sizeof(match));//初始化r匹配的 l
for(int i = 1;i<=l;i++){
memset(visit,false,sizeof(visit));//初始化l的visit数组,表示都没有访问过
if(dfs(i)){//跑dfs遍历
ans++;//找到一个匹配
}
}
return ans;
}
int main(){
int n;
vector<int> res;
while(~scanf("%d",&n))
{
memset(g,false,sizeof(g));//初始化图
int markl[5][5];
vector<string> s;
if(n==0){
break;
}
for(int i = 0;i<n;i++){
string t;
cin>>t;
s.push_back(t); //存string数据
}
int step = 0;//step标记点的序号
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
//如下是缩点操作
if(s[i][j] == '.'){
if(j == 0){
step++;
markl[i][j] = step;
continue;
}
if(s[i][j-1] == 'X'){
step++;
}
markl[i][j] = step;
}
}
}
l = step;//记录集合l的数量
int markr[5][5];
step = 0;
for(int j = 0;j<n;j++){
for(int i = 0;i<n;i++){
if(s[i][j] == '.'){
if(i == 0){
step++;
markr[i][j] = step;
continue;
}
if(s[i-1][j] == 'X'){
step++;
}
markr[i][j] = step;
}
}
}
r = step;
for(int i = 0;i<n;i++){
for(int j = 0;j<n;j++){
if(s[i][j] == '.')
g[markl[i][j]][markr[i][j]] = true;//如果缩点后两者有交点,则在邻接矩阵上建边
}
}
cout<<hungary()<<endl;
}
return 0;
}
hdu 1045 Fire Net(二分图)的更多相关文章
- HDU 1045 Fire Net 二分图建图
HDU 1045 题意: 在一个n*n地图中,有许多可以挡住子弹的墙,问最多可以放几个炮台,使得炮台不会相互损害.炮台会向四面发射子弹. 思路: 把行列分开做,先处理行,把同一行中相互联通的点缩成一个 ...
- HDU - 1045 Fire Net (二分图最大匹配-匈牙利算法)
(点击此处查看原题) 匈牙利算法简介 个人认为这个算法是一种贪心+暴力的算法,对于二分图的两部X和Y,记x为X部一点,y为Y部一点,我们枚举X的每个点x,如果Y部存在匹配的点y并且y没有被其他的x匹配 ...
- hdu 1045 Fire Net 二分图匹配 && HDU-1281-棋盘游戏
题意:任意两个个'车'不能出现在同一行或同一列,当然如果他们中间有墙的话那就没有什么事,问最多能放多少个'车' 代码+注释: 1 //二分图最大匹配问题 2 //难点在建图方面,如果这个图里面一道墙也 ...
- HDOJ(HDU).1045 Fire Net (DFS)
HDOJ(HDU).1045 Fire Net [从零开始DFS(7)] 点我挑战题目 从零开始DFS HDOJ.1342 Lotto [从零开始DFS(0)] - DFS思想与框架/双重DFS HD ...
- HDU 1045 Fire Net 【连通块的压缩 二分图匹配】
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1045(Fire Net)题解
以防万一,题目原文和链接均附在文末.那么先是题目分析: [一句话题意] 给定大小的棋盘中部分格子存在可以阻止互相攻击的墙,问棋盘中可以放置最多多少个可以横纵攻击炮塔. [题目分析] 这题本来在搜索专题 ...
- hdu 1045 Fire Net(最小覆盖点+构图(缩点))
http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit:1000MS Memory Limit:32768KB ...
- HDU 1045 Fire Net(dfs,跟8皇后问题很相似)
传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
- HDU 1045——Fire Net——————【最大匹配、构图、邻接矩阵做法】
Fire Net Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Sta ...
- HDU 1045 Fire Net 状压暴力
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045 Fire Net Time Limit: 2000/1000 MS (Java/Others) ...
随机推荐
- 题解 AT1812 【テレビ】
题目大意 高桥君有一个宽\(w\),高\(h\)的电视机. 判定\(w:h\)是\(4:3\)还是\(16:9\). 分析 我们可以理解成把一个比\(w:h\)化为最简整数比,也就是将\(w:h\)化 ...
- 华为高斯 GaussDB 100 OLTP 单机在 RHEL 7.6 上的安装
目录 你需要知道的 操作系统安装 GaussDB 100 安装 环境设置 创建用户组/用户/文件夹 软件上传/解压/安装 启动数据库 DataStudio 连接 服务器环境设置 DataStudio ...
- linux 搭建python虚拟环境
requirements.txt 包含paramiko,pysfp.setuptools,适用python版本3.6.6+ 前提编译安装python wget wget https://www.pyt ...
- Codeforces 1303E. Erase Subsequences 代码(dp 字符串压缩一维状态优化)
https://codeforces.com/contest/1303/problem/E #include<bits/stdc++.h> using namespace std; ; i ...
- 133.在django中使用memcached
1. 在django中使用memcached,可以在settings.py文件中DATABASES变量下面配置CACHES缓存相关配置信息,只允许本机连接memcached就可以设置LOCATION为 ...
- C 基础 _Generic 泛型应用
引言 - _Generic 用法简介 #include <stdio.h> #define TYPENAME_CASE(type) \ type: #type, #define TYPEN ...
- LED Holiday Light-5 Mm Wide Angle Cone Lights: Pros
But in rare cases, the opposite is true: the opinions of consultants are so synchronized that it is ...
- 在IIS中配置申请的SSL证书
第一步,右键服务器证书=>打开功能 第二步,右侧选择导入,将申请到的证书按窗体内容导入即可 第三步,右键需要加载证书的网站,选择编辑绑定=>类型选择https=>选择刚才导入的数字证 ...
- webpack如何编译ES6打包
前言:随着ES的普及我们越来越多的开始使用ES6的语法了,当然也随着mvvm框架的流行少不了js模块化,那js模块化又有那些呢 在很早的时候大家都用的命名空间,现在也有人用(库名.类别名.方法名) 后 ...
- python3运行调用htmltestrunner时,报错UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 0
之前解决过一次,又忘了,这次写下来了..百度没有的,跟我环境有关! 环境:自动化运行环境python3.6.5 上期说到了,写了一个bat来运行runallcase.py. 但是双击运行却报错:Uni ...