Descroption

原题链接 你有一个\(n*m\)的矩形,一开始所有格子都是白色,然后给出一个目标状态的矩形,有的地方是白色,有的地方是黑色,你每次可以选择一个连通块(四连通块,且不要求颜色一样)进行染色操作(染成白色或者黑色)。问最少操作次数。\(1 \leq n, m, \leq 50.\)

Solution

对目标矩形的同色联通块缩点,向相邻的异色联通块连边,代表先把该块和它所有相邻的块染成同色,再把该块染成异色。至于为什么是最优的我也不知道,考场上手玩出来的qwq那么这个图的某一颗\(BFS\)树的最大深度就是以该树根为染色中心向四周扩展的答案,又因为范围很小,考虑枚举树根。

Code

#include <bits/stdc++.h>
#define Set(a, b) memset(a, b, sizeof (a))
#define For(i, j, k) for (register int i = j; i <= k; ++i)
#define Forr(i, j, k) for (register int i = j; i >= k; --i)
using namespace std; inline void File() {
freopen("bzoj2638.in", "r", stdin);
freopen("bzoj2638.out", "w", stdout);
} const int N = 50 + 5, M = N * N; char s[N];
const int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};
struct node { int sx, sy; } st[M];
int a[N][N], n, m, vis[N][N], dep[M];
int id[M], cnt, ans, tt[M], vis1[N][N]; vector<int> nxt[M]; inline void dfs(int x, int y) {
vis[x][y] = cnt, id[cnt] = a[x][y];
st[cnt] = (node) {x, y};
For(i, 0, 3) {
int dx = x + dir[i][0], dy = y + dir[i][1];
if (dx < 1 || dx > n || dy < 1 || dy > m || a[x][y] ^ a[dx][dy] || vis[dx][dy]) continue;
dfs(dx, dy);
}
} inline void dfs1(int x, int y) {
vis1[x][y] = 1;
For(i, 0, 3) {
int dx = x + dir[i][0], dy = y + dir[i][1];
if (dx < 1 || dx > n || dy < 1 || dy > m || vis1[dx][dy]) continue;
if (vis[x][y] ^ vis[dx][dy]) {
if (!tt[vis[dx][dy]]) tt[vis[dx][dy]] = 1, nxt[vis[x][y]].push_back(vis[dx][dy]);
continue;
}
dfs1(dx, dy);
}
} inline void Solve(int x) { Set(tt, 0); queue<int> Q;
Q.push(x), tt[x] = 1, dep[x] = 1; while (!Q.empty()) {
int u = Q.front(); Q.pop();
for (int i = 0, sz = nxt[u].size(); i < sz; ++ i) {
int v = nxt[u][i];
if (!tt[v]) Q.push(v), dep[v] = dep[u] + 1, tt[v] = 1;
}
} int res = 0, p = 0;
For(i, 1, cnt) if (dep[i] > res) res = dep[i], p = i;
ans = min(ans, res - (id[p] == 0));
} int main() {
File(); cin >> n >> m;
For(i, 1, n) {
scanf("%s", s + 1);
For(j, 1, m) a[i][j] = s[j] == 'B';
} For(i, 1, n) For(j, 1, m) if (!vis[i][j]) ++ cnt, dfs(i, j);
For(t, 1, cnt) Set(vis1, 0), Set(tt, 0), dfs1(st[t].sx, st[t].sy); ans = n * m + 10;
For(i, 1, cnt) Solve(i);
printf("%d\n", ans);
return 0;
}

【Tsinsen A1039】【bzoj2638】黑白染色 (BFS树)的更多相关文章

  1. [bzoj2638] 黑白染色

    比较蛋疼的是我们可以先染个底色,再在底色上染别的东西. 由ccz大爷的题解可得..将目标状态里相同颜色的联通块缩点后,枚举起点,生成树里的最大节点深度就是需要的次数了, 如果最大深度是白色的话记得-1 ...

  2. 【BZOJ-1976】能量魔方Cube 最小割 + 黑白染色

    1976: [BeiJing2010组队]能量魔方 Cube Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 884  Solved: 307[Submi ...

  3. BZOJ-2756 奇怪的游戏 黑白染色+最大流+当前弧优化+二分判断+分类讨论

    这个题的数据,太卡了,TLE了两晚上,各种调试优化,各种蛋疼. 2756: [SCOI2012]奇怪的游戏 Time Limit: 40 Sec Memory Limit: 128 MB Submit ...

  4. POJ 1466 Girls and Boys 黑白染色 + 二分匹配 (最大独立集) 好题

    有n个人, 其中有男生和女生,接着有n行,分别给出了每一个人暗恋的对象(不止暗恋一个) 现在要从这n个人中找出一个最大集合,满足这个集合中的任意2个人,都没有暗恋这种关系. 输出集合的元素个数. 刚开 ...

  5. acdream 1056 (黑白染色)

    题意:给你一些关系,每个关系是两只马的名字,表示这两个马不能在一个分组里,问你能否将这些马分成两组. 黑白染色,相邻的点染不同颜色.bfs搞即可,水题. /* * this code is made ...

  6. bzoj 2132 圈地计划(黑白染色,最小割)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=2132 [题意] 给定n*m个区域,建工业区价值A,建商业区价值B,如果(i,j)有k个 ...

  7. 【AGC018F】Two Trees 构造 黑白染色

    题目描述 有两棵有根树,顶点的编号都是\(1\)~\(n\). 你要给每个点一个权值\(a_i\),使得对于两棵树的所有顶点\(x\),满足\(|x\)的子树的权值和\(|=1\) \(n\leq 1 ...

  8. BZOJ.2756.[SCOI2012]奇怪的游戏(二分 黑白染色 最大流ISAP)

    题目链接 \(Description\) \(Solution\) 这种题当然要黑白染色.. 两种颜色的格子数可能相同,也可能差1.记\(n1/n2\)为黑/白格子数,\(s1/s2\)为黑/白格子权 ...

  9. BZOJ 2131 圈地计划(最小割+黑白染色)

    类似于happiness的一道题,容易想到最小割的做法. 但是不同的是那一道题是相邻的如果相同则有收益,这题是相邻的不同才有收益. 转化到建图上面时,会发现,两个相邻的点连的边容量会是负数.. 有一种 ...

随机推荐

  1. Integer的NPE问题

  2. Django的contenttypes

    这是一个django内置的表结构,为的就是通过两个字段让表和N张表创建FK关系. 比如说有两种不同课程,这两种课程都有价格周期和策略.如果最低级的则是给每个表创建一个价格策略.如果非要在同一个表内使用 ...

  3. jdk下载及环境变量配置

    一.下载 下载链接 二.环境变量:

  4. 解决ERROR 1130: Host '192.168.11.1' is not allowed to connect to this MySQL

    使用navicat进行远程登录MySQL时,报出 ERROR 1130: Host '192.168.11.1' is not allowed to connect to this MySQL  se ...

  5. vue 项目使用 webpack 构建自动获取电脑ip地址

    1.开发 H5 时移动端,经常会使用真机进行调试本地环境.webpack 配置服务器好多脚手架写的都是固定的,而在团队开发中需要每人配置自己的本机 ip 进行开发,每次开启开发环境的都需要修改,并且还 ...

  6. MySQL最大连接数设置

    在使用MySQL数据库的时候,经常会遇到这么一个问题,就是“Can not connect to MySQL server. Too many connections”-mysql 1040错误,这是 ...

  7. Java开发之@PostConstruct执行顺序

    构造函数==>postConstruct==>init==destory==>predestory==卸载servlet;; 从Java EE5规范开始,Servlet增加了两个影响 ...

  8. python设计模式第八天【装饰器模式】

    1.定义 使用包装的释放扩展类的功能,但是不使用继承 2.使用场景 3.代码实现 #!/usr/bin/env python #! _*_ coding:UTF-8 _*_ def MyDecorat ...

  9. tomcat 与 nginx,apache的区别

    tomcat 与 nginx,apache的有什么区别 回答一: 题主说的Apache,指的应该是Apache软件基金会下的一个项目——Apache HTTP Server Project:Nginx ...

  10. Vue之双向数据绑定

    demo.html <!DOCTYPE html> <html lang="en" xmlns:v-bind="http://www.w3.org/19 ...