直接给出题目吧。。。

问题 D(1988): 【高级算法】火力网

时间限制: 1 Sec 内存限制: 128 MB

题目描述

给出一个N*N的网格,用'.'表示空地,用'X'表示墙。在网格上放碉堡,可以控制所在的行和列,但不能穿过墙。

问:最多能放多少个碉堡?

输入

第1行:一个整数N(N<=20)

接下来N行,每行N个字符

输出

第1行:1个整数,表示最多可放碉堡数。

样例输入

4

.X..

....

XX..

....

样例输出

5

不知为何此题的图片居然莫名其妙的消失了,于是自己动手画了一张关于样例的图。



来解释一下样例吧。

现在我们要做的就是在白色格子上放上碉堡。每个碉堡都可以控制它所在的行和列,直到遇到了黑色格子。下图便是一个碉堡的攻击范围。



我们要做的便是在这个地图中放入尽量多的骑士,使他们都不能互相攻击。

题意应该说的很明显了吧,现在我们就要思考一下此题的做法。

骑士的攻击有两个方向,到黑格子为止。所以我们不妨将所有的独立的横向块和独立的竖向块分为两个部,并给它们编上号。



我们可以发现如果任选两个相交的横块与竖块,在它们的交点上放上一个碉堡,则这两个块中都不能再放上碉堡了。这便符合二分图的性质。而最多的可放骑士数则是二分图的最大匹配。

于是我们的方法就出来了,将所有的横块与竖块编上号,如果它们相交便连上边。最后只需要求出最大匹配数即可。具体实现详见代码。

代码

#include <iostream>
#include <cstring>
#include <vector>
using namespace std; #define N 50 char map[N][N];
int fuck[N][N],n,m,vis[N],match[N];
vector <int> G[N]; void Handle() {
int cnt=1;
for(int j=1;j<=n;j++) {
int flag=0;
for(int i=1;i<=n;i++) {
if(map[i][j]!='X')
fuck[i][j]=cnt,flag=0;
else if(map[i-1][j]!='X')
cnt++,flag=1;
}
cnt++;
} m=cnt;cnt++;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
if(map[i][j]!='X')
G[fuck[i][j]].push_back(cnt);
else if(map[i][j-1]!='X')
cnt++;
}
cnt++;
} } bool dfs(int u) {
for(int i=0,v;i<G[u].size();i++) {
v=G[u][i];
if(vis[v]) continue;
vis[v]=1;
if( !match[v] || dfs( match[v] )) {
match[v]=u;
return 1;
}
}
return 0;
} int hungary() {
int ans=0;
for(int i=1;i<=m;i++) {
memset(vis,0,sizeof(vis));
if(dfs(i)) ans++;
}
return ans;
} int main() {
cin>>n;
for(int i=1;i<=n;i++ ) for(int j=1;j<=n;j++)
cin>>map[i][j];
Handle();
/*for(int i=1;i<=m;i++) {
for(int j=0;j<G[i].size();j++)
cout<<G[i][j]<<' ';
cout<<endl;
} */ cout<<hungary();
}

最后说一句。有个奇怪的想法,如果这个地图是三维的,是不是就需要用到“三分图最大匹配”了?

C++二分图匹配基础:zoj1002 FireNet 火力网的更多相关文章

  1. nyoj_239:月老的难题@_@(二分图匹配基础题)

    题目链接 放假回家不知道多少人被父母催着去相亲啊hhhhhhhhhhhhhh @_@ 参考:二分图的最大匹配.完美匹配和匈牙利算法 #include<bits/stdc++.h> usin ...

  2. BZOJ-1143&&BZOJ-2718 祭祀river&&毕业旅行 最长反链(Floyed传递闭包+二分图匹配)

    蛋蛋安利的双倍经验题 1143: [CTSC2008]祭祀river Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1901 Solved: 951 ...

  3. 网络流24题 第三题 - CodeVS1904 洛谷2764 最小路径覆盖问题 有向无环图最小路径覆盖 最大流 二分图匹配 匈牙利算法

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - CodeVS1904 题目传送门 - 洛谷2764 题意概括 给出一个有向无环图,现在请你求一些路径,这些路径 ...

  4. AtCoder Regular Contest 092 C - 2D Plane 2N Points(二分图匹配)

    Problem Statement On a two-dimensional plane, there are N red points and N blue points. The coordina ...

  5. BZOJ3168. [HEOI2013]钙铁锌硒维生素(线性代数+二分图匹配)

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=3168 题解 首先,我们需要求出对于任意的 \(i, j(1 \leq i, j \leq ...

  6. 洛谷P2756 飞行员配对方案问题(二分图匹配)

    传送门 一个基础的二分图匹配(虽然今天才学会) 因为不会匈牙利算法只好用网络流做 先新建一个超级源和超级汇,源往所有左边的点连边,所有右边的点往汇连边 然后跑一边最大流就好了 顺便记录一下匹配到谁就好 ...

  7. UVA 12549 - 二分图匹配

    题意:给定一个Y行X列的网格,网格种有重要位置和障碍物.要求用最少的机器人看守所有重要的位置,每个机器人放在一个格子里,面朝上下左右四个方向之一发出激光直到射到障碍物为止,沿途都是看守范围.机器人不会 ...

  8. POJ 1274 裸二分图匹配

    题意:每头奶牛都只愿意在她们喜欢的那些牛栏中产奶,告诉每头奶牛愿意产奶的牛棚编号,求出最多能分配到的牛栏的数量. 分析:直接二分图匹配: #include<stdio.h> #includ ...

  9. BZOJ1433 ZJOI2009 假期的宿舍 二分图匹配

    1433: [ZJOI2009]假期的宿舍 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2375  Solved: 1005[Submit][Sta ...

随机推荐

  1. list<T>升序、降序

    List<test> list = new List<test> (); var result = list.OrderByDescending(p => p.we).T ...

  2. urllib、urllib2、urllib3区别和使用

    python3中把urllib和urllib合并为一个库了,urllib对应urllib.request 1.) python 中最早内置拥有的网络请求模块就是 urllib,我们可以看一下 urll ...

  3. linux xfs的一次io异常导致的crash

    returned. [ blocked seconds.----这个默认是120,该环境上是被人为设置1200 [8556407.425653] "echo 0 > /proc/sys ...

  4. ssh命令详解

    1.简介: Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定:SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的She ...

  5. neo4j配置(转)

    我的neo4j配置 # 修改第9行,去掉#,修改数据库名 dbms.active_database=wkq_graph.db # 修改第12行,去掉#.修改路径,改成绝对路径 dbms.directo ...

  6. CSS 背景图像 重复图像

    重复图像 background-repeat 属性可以重复图像,这对于小图片来说是福音. background-repeat 属性有6个值: repeat 背景图像在垂直方向和水平方向都重复 repe ...

  7. Halcon知识点随记(每日更新)

    部分积累自重码网视频 1.dev_update_off.dev_update_on 一般dev_update_off放在开始,dev_update_on放在程序结束 dev_update_window ...

  8. soa 和微服务的区别

    soa beased applications are compromised of more loosely coupled componets that use an enterprise ser ...

  9. .NET Core 跨平台发布Linux和OSX

    跨平台发布 简单新建一个项目. mkdir dotnethello cd dotnethello dotnet new dotnet new之后 修改project.json 如下: { " ...

  10. 数据仓库系列 - 缓慢渐变维度 (Slowly Changing Dimension) 常见的三种类型及原型设计

    在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库中?在数据 ...