51nod 1368:黑白棋 二分图最大匹配
多组测试数据,第一行一个整数T,表示测试数据数量,1<=T<=5 每组测试数据有相同的结构构成: 每组数据的第一行有两个整数N,M,表示棋盘的大小,其中1<=N,M<=50. 之后有一个N*M的字符矩阵S,表示棋盘初始状态,其中S[i][j]='.'表示(i,j)格式空的,S[i][j]='x'表示这个格子中有一个黑棋,S[i][j]='o'表示这个格子中有一个白棋。保证任意两颗白棋不相邻。
每组数据一行输出,即棋盘上最多可能出现多少个空格.
3 3 3 o.o .o. o.o 3 3 ... .o. ... 5 5 xxxxx xxoxx xo.ox xxoxx xxxxx
5 8 4
二分图,将相邻的白棋和空格建边,求两者的最大匹配。最终结果是白棋的数量+空格的数量-匹配的数量。
代码:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <map>
#pragma warning(disable:4996)
using namespace std;int n, m;
int v1, v2;
int link[2502];
int visit[2502];
char val[52][52];
int grid[2502][2502];map<int, int>white;
map<int, int>blank;bool bfs(int x)
{int i;for (i = v2; i >= 1; i--){if (grid[x][i] && visit[i] == 0){visit[i] = 1;if (link[i] == -1 || bfs(link[i])){link[i] = x;return true;}}}return false;
}void Magyarors()
{int i, sum;memset(link, -1, sizeof(link));sum = 0;for (i = v1; i >= 1; i--){memset(visit, 0, sizeof(visit));if (bfs(i)){sum++;}}cout << v1+v2-sum << endl;
}int main()
{//freopen("i.txt","r",stdin);//freopen("o.txt","w",stdout);int test, i, j, num_w, num_b, pos_w, pos_b;cin >> test;while (test--){memset(grid, 0, sizeof(grid));memset(val, 0, sizeof(val));white.clear();blank.clear();num_w = 0;num_b = 0;cin >> n >> m;for (i = 1; i <= n; i++){cin >> val[i] + 1;for (j = 1; j <= m; j++){if (val[i][j] == 'o'){white[i*m + j] = ++num_w;}if (val[i][j] == '.'){blank[i*m + j] = ++num_b;}}}v1 = num_w;v2 = num_b;for (i = 1; i <= n; i++){for (j = 1; j <= m; j++){if (val[i][j] == 'o'){pos_w = white[i*m + j];if (val[i - 1][j] == '.'){pos_b = blank[(i - 1)*m + j];grid[pos_w][pos_b] = 1;}if (val[i + 1][j] == '.'){pos_b = blank[(i + 1)*m + j];grid[pos_w][pos_b] = 1;}if (val[i][j + 1] == '.'){pos_b = blank[i*m + j + 1];grid[pos_w][pos_b] = 1;}if (val[i][j - 1] == '.'){pos_b = blank[i*m + j - 1];grid[pos_w][pos_b] = 1;}}}}Magyarors();}//system("pause");return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。
转载于:https://www.cnblogs.com/lightspeedsmallson/p/4928105.html
51nod 1368:黑白棋 二分图最大匹配相关推荐
- 51nod 2006 飞行员配对(二分图最大匹配) 裸匈牙利算法 求二分图最大匹配题
题目: 题目已经说了是最大二分匹配题, 查了一下最大二分匹配题有两种解法, 匈牙利算法和网络流. 看了一下觉得匈牙利算法更好理解, 然后我照着小红书模板打了一遍就过了. 匈牙利算法:先试着把没用过的左 ...
- HDU - 1528 Card Game Cheater(二分图最大匹配)
题目链接:点击查看 题目大意:题意有点像求田忌赛马的最优解,大概意思就是现在有两个人,每个人都有n张不同的扑克牌,扑克牌的大小首先以点数来确定,点数相同的情况下以花色来决定,红桃(Heart)> ...
- 二分图判断以及二分图最大匹配
概念 二分图又称作二部图 ,是图论中的一种特殊模型. 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的 ...
- 【网络流24题】解题报告:A、飞行员配对方案问题(最大流求二分图最大匹配)
A.飞行员配对方案问题 (二分图最大匹配)(最大流)[提高+/省选- ] 题目链接 [问题分析] 二分图最大匹配问题. [建模方法] 在二分图的基础上增加源S和汇T. 1.S向X集合中每个顶点连一条容 ...
- 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)
原题及翻译 Othello is a game played by two people on an 8 x 8 board, using disks that are white on one si ...
- 【模板】匈牙利算法 二分图最大匹配题模板
[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y ...
- 2021牛客多校3 - Minimum grid(二分图最大匹配-最大流)
题目链接:点击查看 题目大意:给出一个 n∗nn*nn∗n 的棋盘,其中有 mmm 个位置是需要填数字的位置,每个位置需要填 [0,k][0,k][0,k] 的数字中的其中一个,可以重复,现在给出每一 ...
- HDU - 1054 Strategic Game(最小点覆盖-二分图最大匹配)
题目链接:点击查看 题目大意:给出一棵树,现在要在节点上放置士兵,每个士兵可以监视与其所在的节点直接相连的节点,问最少需要多少个士兵才能将整棵树都监视到 题目分析:求最少的节点,以保证每条边都有一个端 ...
- HDU - 2389 Rain on your Parade(Hopcroft-Krap算法求二分图最大匹配)
题目链接:点击查看 题目大意:给出n个人和m个雨伞,t分钟后就要下雨了,现在给出每个人的坐标和速度,以及雨伞所在的坐标,每个雨伞只能容纳一个人,题目问最多有多少个人能不被淋到 题目分析:二分图最大匹配 ...
最新文章
- Windows 10如何禁用Microsoft Edge标签页预览
- python3.6.0怎么安装pip_python3.6环境安装+pip环境配置教程图文详解
- springboot使用定时器及发送邮件
- 以无代码的方式将Form打印内容转成生成PDF文件
- 2 0 2 0 年 第 十 一 届 蓝 桥 杯 - 省赛 - CC++大学B组 - B.既约分数
- [道理]关于人生的,很不错!
- 数据结构与算法之美-排序(下)
- linux查看主机硬件命令
- Spring 的循环依赖:真的必须非要三级缓存吗?
- 编辑距离 在输入检测中的应用
- 判断一个整数是否为2的方幂
- ssh连接docker容器
- 【信号处理】采样定理的深入浅出
- sipp uas 脚本
- 中国出口印度尼西亚主要商品
- 变更日志 批准的变更请求 收尾流程 原型法 名义小组 习题
- java.lang.ClassCastException: Ljava.lang.Object; cannot be cast to com.entity.Advertisem异常
- 02-Hadoop集群搭建
- c++语言设计五子棋游戏,C++实现五子棋游戏
- #ifndef #define #endif的作用