ZOJ3781 - Paint the Grid Reloaded(缩点+最短路)

Jetson平台XDMA PCIe驱动安装与测试全指南 本文提供了一份在NVIDIA Jetson平台上安装与测试Xilinx FPGA XDMA PCIe驱动的完整指南。详细阐述了驱动作为高速DMA引擎的核心作用,并逐步讲解了从环境准备、驱动编译、内核模块加载到实际数据传输测试的全过程。内容涵盖常见问题排查与性能优化建议,帮助开发者实现Jetson与FPGA间的高速数据通信,适用于自动驾驶、工业视觉等需要异构计算的应用场景。 阅读详情

题目链接:

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3781


题目大意:

给定一个 N×M 的矩阵,每个格子涂着黑色或白色。现在有一种涂色操作,每次涂色可以将一个格子与这个格子连通的格子涂成一个颜色。连通是指上下左右的边相接。

求最少的操作次数,将这个矩阵涂成一种颜色。


解题过程:

很久以前比赛的题,当时看到这个题一点想法都没有,后来补题看到了是缩点和求最长路,感觉非常神奇,也是第一次接触缩点的思想。


题目分析:

因为每次操作可以将相邻的格子涂成一个颜色,那么我可以将相同颜色连通的格子缩成一个点,与这一块连通格子相邻的相反颜色的点建边。

我们以一块连通块为中心,不断重复的将这一连通块涂成相反的颜色,那么最终会把整个矩阵涂成一个颜色。因为将这个连通块涂成反色的话,这个连通块就会和周围反色的连通块连成一个更大的连通块。

那么最少的操作次数,就遍历所有的点,以某个点为起点,BFS求出的最大步数为以这个点为起点的最少操作数。

为什么这样操作是最少的呢?这样建图构成的是一个二分图,然后想一下就知道了。

AC代码:

BFS染色:

#include <bits/stdc++.h>
using namespace std;

const int MAX = 1600+5, INF = 0x3f3f3f3f;

int n, m, top;
char map_data[MAX][MAX];
int data[MAX][MAX], vis[MAX];
int dirc[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};
vector<int> G[MAX];

//判断是否出界
inline bool edge(int x, int y) {
    return x >= 0 && y >= 0 && x < n && y < m;
}


//用来BFS给图染色
void bfs(int x, int y) {
    queue<pair<int, int> > q;
    data[x][y] = top;
    q.push(make_pair(x, y));
    while (!q.empty()) {
        x = q.front().first;
        y = q.front().second;
        q.pop();
        for (int i = 0; i < 4; i++) {
            int tx = x + dirc[i][0];
            int ty = y + dirc[i][1];
            if (edge(tx, ty) && map_data[x][y] == map_data[tx][ty] && !data[tx][ty]) {
                q.push(make_pair(tx, ty));
                data[tx][ty] = top;
            }
            else if (edge(tx, ty) && data[tx][ty] && data[tx][ty] != data[x][y]) {
                int a = data[x][y], b = data[tx][ty];
                G[a].push_back(b);
                G[b].push_back(a);
            }
        }
    }
}


//染色
void flood_fill() {
    memset(data, 0, sizeof(data));
    top = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (!data[i][j]) {
                top++;
                bfs(i, j);
            }
        }
    }
}

//找出以当前点为起点的最长路
int check_depth(int u) {
    queue<pair<int, int> > q;
    q.push(make_pair(u, 0));
    memset(vis, 0, sizeof(vis));
    vis[u] = 1;
    int max_depth = 0;
    while (!q.empty()) {
        u = q.front().first;
        int depth = q.front().second;
        max_depth = max(depth, max_depth);
        q.pop();
        for (int i = 0; i < G[u].size(); i++) {
            int v = G[u][i];
            if (!vis[v]) {
                q.push(make_pair(v, depth+1));
                vis[v] = 1;
            }
        }
    }
    return max_depth;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d %d", &n, &m);

        for (int i = 0; i <= n*m; i++) {
            G[i].clear();
        }

        for (int i = 0; i < n; i++) {
            scanf("%s", map_data[i]);
        }
        flood_fill();
        int ans = INF;
        for (int i = 1; i <= top; i++) {
            ans = min(check_depth(i), ans);
        }
        printf("%d\n", ans);
    }
}

DFS染色:

#include <bits/stdc++.h>
using namespace std;

const int MAX = 1600+5, INF = 0x3f3f3f3f;

int n, m, top;
char map_data[MAX][MAX];
int data[MAX][MAX], vis[MAX];
int dirc[4][2] = {{1,0},{0,1},{-1,0},{0,-1}};

vector<int> G[MAX];

inline bool edge(int x, int y) {
    return x >= 0 && y >= 0 && x < n && y < m;
}

void dfs(int x, int y, int num, char c) {
    for (int i = 0; i < 4; i++) {
        int tx = x + dirc[i][0];
        int ty = y + dirc[i][1];
        if (!edge(tx, ty))
            continue;
        if (!data[tx][ty] && map_data[tx][ty] == c) {
            data[tx][ty] = num;
            dfs(tx, ty, num, c);
        }
        else if (map_data[tx][ty] != c && data[tx][ty]) {
            int v = data[tx][ty];
            G[v].push_back(num);
            G[num].push_back(v);
        }
    }
}

void flood_fill() {
    memset(data, 0, sizeof(data));
    top = 0;
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (!data[i][j]) {
                data[i][j] = ++top;
                dfs(i, j, top, map_data[i][j]);
            }
        }
    }
}

int check_depth(int u) {
    queue<pair<int, int> > q;
    q.push(make_pair(u, 0));
    memset(vis, 0, sizeof(vis));
    vis[u] = 1;
    int max_depth = 0;
    while (!q.empty()) {
        u = q.front().first;
        int depth = q.front().second;
        max_depth = max(depth, max_depth);
        q.pop();
        for (int i = 0; i < G[u].size(); i++) {
            int v = G[u][i];
            if (!vis[v]) {
                q.push(make_pair(v, depth+1));
                vis[v] = 1;
            }
        }
    }
    return max_depth;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d %d", &n, &m);

        for (int i = 0; i <= n*m; i++) {
            G[i].clear();
        }

        for (int i = 0; i < n; i++) {
            scanf("%s", map_data[i]);
        }
        flood_fill();
        int ans = INF;
        for (int i = 1; i <= top; i++) {
            ans = min(check_depth(i), ans);
        }
        printf("%d\n", ans);
    }
}
第四届“网鼎杯”网络安全大赛 - 青龙组 阅读详情

相关推荐

python-pptx库中文文档及使用样例

个人使用样例及部分翻译自官方文档,并详细介绍chart的使用

4万+

ZOJ - 3781 缩点+最短路径

题目大意:字符一样并且相邻的即为连通。每次可翻转一个连通块X(O)的颜色,问至少改变几次使得图上所有字符都相等 题目思路:每次操作都将本身所在的连通块与和自己相邻的不同颜色的连通块变成同一种颜色,也就是变成一个连通块了,那么要使n次操作后全部变成一样的颜色,也就是从某点出发到达其余所有点。 所以,dfs把连通块缩成点,然后相邻的连通块之间建边,枚举以每个点为根的情况,求最短路。 #inclu...

空白 296

DeepLearning tutorial(7)深度学习框架Keras的使用-进阶

上一篇文章总结了Keras的基本使用方法,相信用过的同学都会觉得不可思议,太简洁了。十多天前,我在github上发现这个框架的时候,关注Keras的人还比较少,这两天无论是github还是微薄,都看到越来越多的人关注和使用Keras。所以这篇文章就简单地再介绍一下Keras的使用,方便各位入门。主要包括以下三个内容: 训练CNN并保存训练好的模型。 将CNN用于特征提取,用提取出来的特征训练SVM。

wepon的专栏 2万+

ZOJ-3781-Paint the Grid Reloaded 缩点+建图+spfa

传送门:ZOJ 3781 题意:给定一个由O和X组成的矩阵,每次可以选择一块翻动,与其相邻的且符号一样的也会一起翻动,即每次翻动一个连通块。 问最少几步能把整个矩阵翻成同样的符号。 思路:将每个连通块缩成点,相邻的连通块建边,于是题目就转化成了新建的图一个点到其他点的最长最短路最短最多少。个人感觉这层转化是最难的,正所谓图论难就难在建图吧。 关于转化的个人理解:因为每次翻动一个连通块,就相

WA是一笔财富 386

实验吧 损坏的U盘镜像

        从网站上可以下载一个CTF.hdd的文件,使用winHex打开,可以知道这是一个exFAT格式的文件。        用binwalk检查一下,发现文件中包含两个zip文件,使用foremost进行提取。一个压缩包需要密码解压缩,另一个解压后发现Password.txt文件。说明另一个压缩包的密码与checksum有关。        通过查看exFAT文件系统格式可以得知如何计算...

xingyyn78的博客 3512

TIBCO Jaspersoft Studio报表开发 使用教程-进阶版

本文学习内容容器定制二级目录三级目录 容器定制 二级目录 三级目录

吉哲的博客 7521

ZOJ3781 - Paint the Grid Reloaded(最短路)

题目链接 ZOJ3781 【题意】给出n*m

转移到dawxy.com 694

反爬虫:POST 请求参数中 Sign 的加密机制详解,并设计带 Sign 校验的网站

本文介绍了API请求中sign签名的生成原理及实现方法。sign是通过对请求参数加密生成的一串字符串,用于验证请求合法性,防止参数篡改、重放攻击和伪造请求。其生成步骤包括参数排序、拼接字符串、加盐和哈希加密。文章还演示了如何在FastAPI后端实现带sign验证的新闻网站,包括参数校验、时间戳验证和签名比对等安全措施,有效提升API安全性,增加爬虫逆向难度。

数据知道的博客 4075

ZOJ 3781 最短路(想法好题目)

题意: 给你一个n*m的矩阵,上面只有两种字符,X或者O,每次可以同时改变相同颜色的一个连通块,上下左右连通才算连通,用最小的步数把这个图弄成全是X或者全是O,题意要是没看懂看下面的样例。 Sample Input 2 2 2 OX OX 3 3 XOX OXO XOX Sample Outp...

墨鱼菜鸡 374

配置 SAP Web Dispatcher 的实战指南:打通 SAP Fiori、SAP Gateway 与前端系统的关键一跳

SAP Web Dispatcher 在 Fiori 架构中扮演关键角色,作为统一入口处理 HTTPS 请求、实现安全代理和流量分发。它将分散在不同系统的访问路径统一收口,解决浏览器同源策略限制,集中管理 HTTPS 终止和客户端信息传递。典型配置中,Web Dispatcher 监听 443 端口,根据路径将 OData 请求转发至 Gateway 系统,静态资源请求送至前端服务器。SSL 相关配置(如 PSE 文件)确保安全通信,而路由规则(wdisp/system_xx)决定请求转发目标。实施时需注意

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 102

Qt C++ + Qt 3D 的数字孪生工厂

以下是一个基于 **Qt C++ + Qt 3D** 的数字孪生工厂完整源码示例,集成了 **Qt 3D** 产线建模和 **WebSocket** 实时数据交互。ui->qualifiedProductsLabel->setText(QString("合格产品: %1").arg(data.qualifiedProducts));ui->totalProductsLabel->setText(QString("总产量: %1").arg(data.totalProducts));

寒寒豆豆软件公司的博客 149

ZOJ3781-Paint the Grid Reloaded(缩点+bfs)

Paint the Grid Reloaded Time Limit: 2 Seconds      Memory Limit: 65536 KB Leo has a grid with N rows and M columns. All cells are painted with either black or white initially. Two cells A and

wang_128的博客 452

无人船 | 基于ROS的轻量级多无人艇自主导航仿真框架

无人水面艇USV是海上自主无人系统的关键组成部分,在民用、军用领域应用广泛,例如海上救援、水质测量、扫雷反潜等,因此对USV导航算法的研究具有重要意义。为了便于进行USV相关算法的验证与部署,本文介绍的这套基于ROS的多无人艇的自主导航仿真平台,轻量化地实现了建图、规划、控制等多种功能,同时自研框架保证了功能的高度可拓展和可定制

FRIGIDWINTER的博客 8002

Paint the Grid Reloaded ZOJ - 3781(缩点 最短路)

ZOJ - 3781 把每个连通块缩点,相邻的点建边 然后从某点出发,求到所有点的最短路 取其中最大的值 然后遍历所有的点为起点 取最小值 遍历起点 就相当于 第一次操作 翻动该点(是一个连通块) 然后该点就和与它相邻的所有的点的颜色都一样了 然后翻动下一个点···· 直到路径最长的点 那么所有的点的颜色就都一样了 每次翻动一个连通块,就相当于把这个连通块和其相邻但不同色...

weixin_30521649的博客 71

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

zoj 3781 Paint the Grid Reloaded (最短路,连通块缩点)

Leo has a grid with N rows and M columns. All cells are painted with either black or white initially. Two cells A and B are called connected if they share an edge and they are in the same color, or

芒果街上的小屋(此博客暂时停用) 1116

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

zoj 3781 Paint the Grid Reloaded(前向星+缩点+最短路)

图论

Infinity_Izayoi的博客 604

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

*【ZOJ - 3781】Paint the Grid Reloaded(dfs求连通块缩点,bfs求最短路,建图技巧)

题干: Leo has a grid withNrows andMcolumns. All cells are painted with either black or white initially. Two cellsAandBare calledconnectedif they share an edge and they are in the same color,...

xuanweiace的博客 488

ZOJ 3781 Paint the Grid Reloaded(DFS连通块缩点+BFS求最短路)

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5268 题目大意:字符一样并且相邻的即为连通。每次可翻转一个连通块X(O)的颜色,问至少改变几次使得图上所有字符都相等。 解题思路: 1) dfs( 建图 ) ,因为翻转的时候每翻转连通块中一个整个连通块都翻转,这样你可以将其看成一个有边相连的无向图,每...

weixin_30394333的博客 133

zoj 3781 Paint the Grid Reloaded 最短路变形

题意:给出n*m的只包含‘X’或‘O’的矩阵,可以将一个联通块内所有相连的X翻转成O,也可以将相连的O翻转成X,(相连指有一边相连)问翻转到同一种字符的最少次数 将联通块缩点,然后到别的联通块的距离就是翻转到该联通块需要的次数,对以每个联通块为起点跑一次最短路,求出最长距离,然后在最长距离里面找最短的就行了 /******************************************

uuuuuu 497

ZOJ 3781 Paint the Grid Reloaded 题解 (dfs缩点+BFS)

题意:这题就两种颜色,颜色相同且有公共边的(或者通过另一个相同的颜色连接)为一个连通块,如果翻转其中一个,与它在同一个连通块里的都要改变颜色,求达到相同颜色的最小步数。 解题思路:dfs ( 建图) + bfs ( 寻找最优解 ) . 1)  dfs( 建图 ) ,因为翻转的时候每翻转连通块中一个整个连通块都翻转,这样你可以将其看成一个有边相连的无向图,每个边的两个顶点颜色都不一样。

K键盘里的青春K 721

zoj 3781 Paint the Grid Reloaded (比较隐含的最短路)

Paint the Grid Reloaded Time Limit: 2 Seconds      Memory Limit: 65536 KB Leo has a grid with N rows and M columns. All cells are painted with either black or white initially. Two cells A

To be what you what to be! 1497

ZOJ - 3781 Paint the Grid Reloaded (spfa+bfs+缩点)

Leo has a grid with N rows and M columns. All cells are painted with either black or white initially.Two cells A and B are called connected if they share an edge and they are in the same color, or the...

dsaghjkye的博客 194

ZOJ - 3781 Paint the Grid Reloaded 题解

题目大意:   给一个n*m的X O构成的格子,对一个点操作可以使与它相连通的所有一样颜色的格子翻转颜色(X—>O或O—>X),问给定的矩阵最少操作多少次可以全部变成一样的颜色。 思路:   1.每次操作都将本身所在的连通块与和自己相邻的不同颜色的连通块变成同一种颜色,也就是变成一个连通块了,那么要使n次操作后全部变成一样的颜色,也就是从某点出发到达其余所有点。  ...

diyan2150的博客 138

【连通块+bfs】F - Paint the Grid Reloaded ZOJ - 3781

F - Paint the Grid Reloaded ZOJ - 3781 Leo has a grid withNrows andMcolumns. All cells are painted with either black or white initially. Two cellsAandBare calledconnectedif they share an e...

qq_41037114的博客 492

ZOJ-3781-Paint the Grid Reloaded【11th浙江省赛】【连通块缩点】【spfa】【好题】

ZOJ-3781-Paint the Grid Reloaded

Linoy 1349
上一篇: POJ3259 - Wormholes(连通图判断负环)
下一篇: 匹配、覆盖、独立集、二分图与网络流
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值