直接给出题目吧。。。

问题 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. CSS 背景图像 background属性简写

    background属性简写 background属性可以像margin padding属性一样,有简写方法,它的简写顺序是: background-color background-image ba ...

  2. jQuery入门学习

    一.jQuery的介绍 1.jQuery是一种轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够方便处理HTML Document Events 实现动画效果.方便的进行Aj ...

  3. TestNG实现用例运行失败自动截图(转载)

    转载自:https://blog.csdn.net/galen2016/article/details/70193684 重写Listener的onTestFailure方法 package com. ...

  4. WCF基础_使用svcutil.exe 工具来生成调用文件

    右键单击一个服务在浏览器中打开时,通常会有这么一段话: ServiceDemo 服务 已创建服务. 若要测试此服务,需要创建一个客户端,并将其用于调用该服务.可以使用下列语法,从命令行中使用 svcu ...

  5. step_by_step_xUnit_Net_ABP

    这段日子的开发一直使用Asp.net Boilerplate ,称之为项目模板自然就有开发中常用的功能,测试框架也在其中,土牛的ABP源代码都有通过测试,很遗憾的是我之前没有写过测试,不会就要去找资料 ...

  6. iis网站部署常见错误

    sqlserver 授权登录名没有db_owner权限 数据库连接字符串端口没开,连接形式:192.168.0.1,1433

  7. NetCore+MySql+EF 数据库生成实体模型

    NetCore版本    2.1 1.点击“工具”->“NuGet包管理器”->“程序包管理器控制台” 分别安装以下几个包 Mysql 版本: MySql.Data.EntityFrame ...

  8. python_Tkinter

    Tkinter相关 python支持多种图形界面的第三方库,包括:TKwxWidgetsQTGTK等等但是python自带的库是支持TK的TKinter,使用使用Tkinter,无需安装任何包,就可以 ...

  9. 跳转Activity时清除当前Activity

    void GotoMainActivity(){ Intent intent = new Intent(ProductionInformationActivity.this, MainActivity ...

  10. centos 7 开机yum

    yum -y install net-tools yum -y install wget