BZOJ2638 黑白染色

2022-05-09 15:09:40 字數 1569 閱讀 6635

試題描述

你有乙個 \(n \times m\) 的矩形,一開始所有格仔都是白色,然後給出乙個目標狀態的矩形,有的地方是白色,有的地方是黑色,你每次可以選擇乙個連通塊(四連通塊,且不要求顏色一樣)進行染色操作(染成白色或者黑色)。問最少操作次數。

輸入第一行兩個數 \(n\),\(m\) 表示矩形大小。

接下來n行描述目標狀態,每行m個字元,』w』表示白色,』b』表示黑色。

輸出一行乙個整數表示運算元。

輸入示例

3 3

wbwbwb

wbw

輸出示例
2
資料規模及約定

\(100\%\) 的資料 \(n \le 50,m \le 50\)

\(15\%\) 的資料 \(n \times m \le 15\)

另外 \(15\%\) 的資料 \(m=1\)

題解從每個點出發 bfs,找到最大的黑點的步數 \(x\),所有起點的最小 \(x\) 就是答案。

其實就是一棵樹從葉節點開始向上染色,那麼顯然需要最深深度的步數染成目標樣子。

#include #include #include #include #include #include using namespace std;

#define rep(i, s, t) for(int i = (s), mi = (t); i <= mi; i++)

#define dwn(i, s, t) for(int i = (s), mi = (t); i >= mi; i--)

int read()

while(isdigit(c))

return x * f;}

#define maxr 55

#define maxn 2510

#define maxm 20010

#define oo 2147483647

int n, m, n, id[maxr][maxr];

char map[maxr][maxr];

int fa[maxn];

bool col[maxn];

int findset(int x)

void union(int a, int b, char tp)

int nodes[maxn], cnt, m, head[maxn], nxt[maxm], to[maxm];

bool hasn[maxn];

void addedge(int a, int b)

int q[maxn], hd, tl, vis[maxn], ans;

void bfs(int s)

ans = min(ans, tmp);

return ;}

int main()

rep(i, 1, n)

rep(i, 1, n) rep(j, 1, m)

ans = oo;

rep(i, 1, cnt) bfs(nodes[i]);

printf("%d\n", ans);

return 0;

}

bzoj2638 黑白染色

比較蛋疼的是我們可以先染個底色,再在底色上染別的東西。由ccz大爺的題解可得。將目標狀態裡相同顏色的聯通塊縮點後,列舉起點,生成樹里的最大節點深度就是需要的次數了,如果最大深度是白色的話記得 1.1 include2 include3 include4 include5 using namespac...

2638 黑白染色

題目鏈結 題目大意 黑白矩陣,每次可以選擇乙個四聯通塊染色,求最少操作次數 題解 將目標狀態裡相同顏色的聯通塊縮點,列舉起點,生成樹里的最大節點深度就是需要的次數了 如果最大深度是白色的話記得 1 我的收穫 bfs樹 include include include include using nam...

E Cover it 黑白染色問題

傳送門哈哈傳遞哈斯防火牆 因為圖 聯通,我 們任取一 點開始遍 歷因為圖聯通,我們任取一點開始遍歷 因為圖聯通,我們任取 一點開始 遍歷 比如從 點1開始 那麼假 設1塗色 比如從點1開始,那麼假設1塗色 比如從點1開 始,那麼 假設1塗 色 那 麼和 1相鄰的 不上色,相鄰的相 鄰上 色那麼和1相...