Paint the Grid Reloaded (将联通块缩点+BFS)

本文介绍了一种解决图中所有颜色通过最少步骤变为统一颜色的问题。通过将相同颜色的联通区域缩点并建立相邻联通区域间的连接,利用广度优先搜索算法找到最优解。

传送门

题意

能够上下左右相通的并且颜色相同的块为一个整体,就是所谓的联通块。然后每次对联通块进行反转颜色操作,最后要求最小的步数使得图中所有的颜色相同。

思路

  • 将所有能够相通的相同颜色进行缩点,形成联通块
  • 然后能够上下左右连通的联通块进行建边
  • 最后枚举所有的联通块,进行 b f s bfs bfs 标记操作,将所有的答案取最小值,就是最终答案
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
template <typename T>
inline void rd(T& x)
{
	ll tmp = 1; char c = getchar(); x = 0;
	while (c > '9' || c < '0') { if (c == '-')tmp = -1; c = getchar(); }
	while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
	x *= tmp;
}
const int inf = 0x3f3f3f3f;
const int mod = 7;
const int N = 2e4 + 10;
const int M = 1e7 + 10;
const double eps = 1e-8;
int n, m;
char mp[55][55];
bool vis[55][55];
int num[55][55];
int dir[][2] = { 1,0,-1,0,0,1,0,-1 }, cnt;
void bfs(int x,int y) {
	queue<pii>que;
	que.push({ x,y });
	stack<pii>stk;
	while (!que.empty()) {
		pii p = que.front(); que.pop();
		stk.push(p);
		if (vis[p.first][p.second]) continue;
		vis[p.first][p.second] = 1;
		for (int i = 0; i < 4; ++i) {
			int xx = p.first + dir[i][0], yy = p.second + dir[i][1];
			if (xx <= 0 || xx > n || yy <= 0 || yy > m || vis[xx][yy] || mp[xx][yy] != mp[p.first][p.second]) continue;
			que.push({ xx,yy });
		}
	}
	++cnt;
	while (!stk.empty()) {
		pii p = stk.top(); stk.pop();
		num[p.first][p.second] = cnt;
	}
}
int head[N], cntE;
struct edge {
	int next, to;
}e[M];
void add(int u, int v) {
	e[cntE].to = v;
	e[cntE].next = head[u];
	head[u] = cntE++;
}
bool mark[N];
int bfs(int x) {
	queue<pii>que;
	que.push({ x,1 });
	int ans = 0;
	while (!que.empty()) {
		pii p = que.front(); que.pop();
		int u = p.first;
		if (mark[u]) continue;
		mark[u] = true;
		ans = max(ans, p.second);
		for (int i = head[u]; ~i; i = e[i].next) {
			int v = e[i].to;
			if (mark[v]) continue;
			que.push({ v,p.second + 1 });
		}
	}
	return ans-1;
}
int solve() {
	memset(vis, false, sizeof vis); cnt = 0;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			if (vis[i][j]) continue;
			bfs(i, j);
		}
	}
	memset(head, -1, sizeof head); cntE = 0;
	for (int i = 1; i <= n; ++i) {
		for (int j = 1; j <= m; ++j) {
			for (int k = 0; k < 4; ++k) {
				int x = i + dir[k][0], y = j + dir[k][1];
				if (x <= 0 || x > n || y <= 0 || y > m) continue;
				if (num[x][y] != num[i][j]) add(num[i][j], num[x][y]);
			}
		}
	}
	int minn = inf;
	for (int i = 1; i <= cnt; ++i) {
		for (int j = 1; j <= cnt; ++j) mark[j] = false;
		minn = min(minn, bfs(i));
	}
	return minn;
}
int main() {
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
//	FILE* _INPUT = freopen("input.txt", "r", stdin);
//	FILE* _OUTPUT = freopen("output.txt", "w", stdout);
	int T; rd(T);
	while (T--) {
		rd(n), rd(m);
		for (int i = 1; i <= n; ++i) {
			for (int j = 1; j <= m; ++j) {
				scanf(" %c", &mp[i][j]);
			}
		}
		printf("%d\n", solve());
	}
	return 0;
}
【复现】并_离网风光互补制氢合成氨系统容量-调度优化分析(Python代码实现)内容概要:本文围绕“并_离网风光互补制氢合成氨系统容量-调度优化分析”的主题,提供了基于Python代码实现的技术研究与复现方法。通过构建风能、太阳能互补的可再生能源系统模型,结合电解水制氢与合成氨工艺流程,对系统的容量配置与运行调度进行联合优化分析。利用优化算法求解系统在不同运行模式下的最优容量配比和调度策略,兼顾经济性、能效性和稳定性,适用于并网与离网两种场景。文中强调通过代码实践完成系统建模、约束设定、目标函数设计及求解过程,帮助读者掌握综合能源系统优化的核心方法。; 适合人群:具备一定Python编程基础和能源系统背景的研究生、科研人员及工程技术人员,尤其适合从事可再生能源、氢能、综合能源系统优化等相关领域的从业者;; 使用场景及目标:①用于教学与科研中对风光制氢合成氨系统的建模与优化训练;②支撑实际项目中对多能互补系统容量规划与调度策略的设计与验证;③帮助理解优化算法在能源系统中的应用逻辑与实现路径;; 阅读建议:建议读者结合文中提供的Python代码进行逐模调试与运行,配合文档说明深入理解模型构建细节,重关注目标函数设计、约束条件设置及求解器调用方式,同时可对比Matlab版本实现以拓宽工具应用视野。
<think>嗯,用户想知道为什么NumPy模会被重新加载,以及这有什么影响。首先,我需要回忆一下Python模的加载机制。当模被导入时,Python会检查sys.modules是否已经有该模,如果有的话,就不会重新加载。但有时候,可能在代码中显式地重新加载了模,或者存在不同的模路径导致重复加载。 根据用户提供的引用[3],出现警告说NumPy被重新加载,这可能是因为在代码中多次导入了NumPy,或者在不同的路径下存在多个版本。比如,用户可能用了conda环境和系统自带的Python环境,导致模路径混乱。这时候,Python可能会先加载一个旧版本的NumPy,然后在另一个地方又加载了新版本,从而触发警告。 接下来,影响方面,引用[3]提到这可能导致微妙的问题。比如,不同模可能依赖不同版本的NumPy,如果被重新加载,可能会导致某些函数行为不一致,或者内存占用增加。还有可能破坏单例模式,或者引起线程安全问题。 解决方案的话,用户可能需要检查他们的环境,确保只有一个NumPy版本被安装。可以通过conda list查看已安装的包,卸载多余的版本。另外,检查代码中是否有重复导入的情况,或者使用绝对导入来避免问题。如果确实需要重新加载,可以用importlib.reload,但一般不推荐这样做。 用户可能遇到的问题可能和他们的环境配置有关,比如conda环境和本地Python环境混用,或者安装路径有冲突。需要确保激活正确的环境,并清理旧版本的NumPy。引用[1]和[2]提到用户之前尝试卸载NumPy,可能环境里还有残留,导致模被多次加载。 总结起来,用户需要检查环境路径,确保NumPy只安装一次,避免重复导入,并处理可能存在的路径冲突。这样就能解决模重新加载的问题,避免潜在的影响。</think>### 为什么NumPy模会被重新加载?其影响是什么? #### 原因分析 1. **重复导入或路径冲突** Python模默认只会加载一次(存储在`sys.modules`中),但如果代码中通过不同路径多次显式导入,或存在多个安装路径的残留文件,可能导致模被重新加载。例如: - 同时使用`conda`环境和系统全局环境时,路径优先级可能导致旧版本被优先加载[^1][^3]。 - 在代码中手动调用`reload(numpy)`(如通过`importlib.reload`)。 2. **依赖库的隐式重新加载** 某些库(如`pandas`)依赖NumPy,若这些库的初始化过程中重复导入NumPy,可能触发重新加载。例如: ```python # 示例:pandas初始化时可能间接重新导入NumPy import pandas as pd # 触发对NumPy的二次加载 ``` #### 主要影响 1. **数据一致性问题** - 若新旧版本NumPy共存,不同模可能引用不同版本的函数,导致计算结果不一致。例如,旧版本的随机数生成器与新版本行为不同。 - 单例对象(如`np.random`的全局状态)可能被重置,影响随机性控制。 2. **内存浪费与性能下降** 模重复加载会导致内存占用增加,尤其是在处理大型数组时。 3. **兼容性风险** 重新加载可能破坏模初始化时的全局配置(如浮运算精度设置)。 --- #### 解决方案 1. **清理重复安装的NumPy** 通过以下命令彻底卸载旧版本: ```bash conda uninstall numpy --force # 强制卸载所有残留 pip uninstall numpy # 补充清理pip安装的版本 conda install numpy # 重新安装最新版 ``` 2. **检查Python环境路径** 确保当前激活的conda环境路径优先级最高: ```bash echo $PATH # 查看路径顺序,conda环境路径应位于系统路径之前 ``` 3. **避免代码中的重复导入** 统一使用绝对导入,并检查依赖库的初始化逻辑: ```python import numpy as np # 统一入口 # 避免在子模中重复导入 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值