可撤销并查集,原理分析,题目练习
零、写在前面
可撤销并查集代码相对简单,但是使用场景往往比较复杂,经常用于处理离线查询,比较经典的应用是结合线段树分治维护动态连通性问题。在一些较为综合的图论问题中也经常出现。
前置知识:并查集,扩展域并查集,带边权并查集详解,OJ练习,详细代码
一、可撤销并查集
1.1 可撤销并查集
可撤销并查集(Revertible Disjoint Union)是一种支持撤销上一次合并操作的并查集。
1.2 启发式合并
可撤销并查集无法使用路径压缩优化,只能使用启发式合并,因而可撤销并查集的查询复杂度是O(logn)的
1.3 数据定义
constexpr int N = 2E5; // 节点数
int f[N]; // 父节点
int siz[N]; // 集合size
std::stack<std::pair<int, int>> his; // 操作记录栈
1.4 查询祖先
暴力上跳即可,树高为O(logn),因而时间复杂度为O(logn)
int find(int x) {while (f[x] != x) {x = f[x]; }return x;
}
1.5 合并操作
- 如果 x, y 在同一集合,合并失败 返回false
- 否则 取 x 为大树根节点(启发式合并)
- 记录 merge(x, y) 操作到his
- siz[x] += siz[y], f[y] = x
- 合并成功返回 true
bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) {return false;}if (siz[x] < siz[y]) {std::swap(x, y);}his.emplace_back(x, y);siz[x] += siz[y];f[y] = x;return true;
}
1.6 撤销操作
- 因为栈顶始终保存的是我们上一次合并操作
- 所以回滚到上一次的状态只需弹出上次 merge(x, y) 的 x, y,并恢复 f[y] 和 siz[x] 即可
- 进一步,如果 想要回滚到 tm时刻,我们只需不断的弹栈恢复,直至 his 栈的size = tm
void revert(int tm) {while (his.size() > tm) {auto [x, y] = his.back();his.pop_back();f[y] = y;siz[x] -= siz[y];}
}
1.7 基本模板
因为 需要可撤销并查集的题目往往需要对维护的信息做修改,所以我一般选择手写,不过这里还是放一个泛用性强一点的模板。
struct DSU {std::vector<int> siz;std::vector<int> f;std::vector<std::pair<int, int>> his;DSU(int n) : siz(n, 1), f(n) {std::iota(f.begin(), f.end(), 0);}int find(int x) {while (f[x] != x) {x = f[x];}return x;}bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) {return false;}if (siz[x] < siz[y]) {std::swap(x, y);}his.emplace_back(x, y);siz[x] += siz[y];f[y] = x;return true;}int time() {return his.size();}void revert(int tm) {while (his.size() > tm) {auto [x, y] = his.back();his.pop_back();f[y] = y;siz[x] -= siz[y];}}int size(int x) {return siz[find(x)];}
};
二、题目练习
2.1 Ex - Ball Collector
原题链接
Ex - Ball Collector
思路分析
题意就是说一颗以1为根的树,每个节点有两个数字,求出 2~n 每个节点的 最小代价
最小代价的定义为:1 ~ v 路径上每个节点拿一个数,能拿的最小种类数。
我们单看对于 1~v 这条路径的代价怎么求?
我们把每个数字看作新图节点,每个树节点的 A[v], B[v] 相当于 对 A[v] 和 B[v] 连边,那么我们对1~v路径建图得到的新图会有若干个连通块。
我们发现每条边其实就是选数操作,所以答案不会超过边数
又因为节点数目一共就那么多,所以每个连通块的贡献就是 min(V, E),其中 V 为节点数,E 为边数
每条路径暴力计算是O(N^2),我们发现我们dfs 暴力计算的问题就在于:回溯的时候如何删边删贡献?
可撤销并查集可以帮我们轻松解决,dfs 进入一个节点,我们merge(u, v),记录当前时刻 t
回溯时,我们revert 到 t 时刻即可。
现在考虑如何维护 min(V, E)
我们发现 一个连通块如果是树,那么答案就是 E(即 V - 1),否则就是 V
除了 可撤销DSU 本身维护的 siz 和 f 数组外,我们额外维护一个 loop[] 数组,代表该连通块环的数目
对于merge(x, y),我们除了维护f[] 和 siz[] 还要合并两个连通块的 loop
对于x 和 y 在同一连通块的情况,如果 当前连通块无环,说明我们原先是树,我们 e[x] = 1后返回true,否则返回false
对于x 和 y 不在同一连通块的情况,如果x 和 y 所在连通块都有环,那么我们不合并,返回false。因为合并无用
否则 正常合并,并且 loop[x] += loop[y]
撤销的时候相应撤销即可。
AC代码
时间复杂度:O(nlogn),log 是可撤销DSU的代价
#include <bits/stdc++.h>using i64 = long long;constexpr int N = 2E5;int f[N], siz[N], e[N];
std::stack<std::pair<int &, int>> his;int find(int x) {while (f[x] != x) {x = f[x]; }return x;
}void change(int &x, int y) {his.emplace(x, x);x = y;
}bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) {if (!e[x]) {change(e[x], 1);return true;} else {return false;}}if (e[x] && e[y]) {return false;}if (siz[x] < siz[y]) {std::swap(x, y);}change(siz[x], siz[x] + siz[y]);change(e[x], e[x] + e[y]);change(f[y], x);return true;
}int time() {return his.size();
}void revert(int tim) {while(his.size() > tim) {auto [x, y] = his.top();his.pop();x = y;}
}int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int N;std::cin >> N;std::iota(f, f + N, 0);std::fill(siz, siz + N, 1);std::vector<int> A(N), B(N);for (int i = 0; i < N; ++ i) {std::cin >> A[i] >> B[i];-- A[i], -- B[i];}std::vector<std::vector<int>> adj(N);for (int i = 0; i + 1 < N; ++ i) {int u, v;std::cin >> u >> v;-- u, -- v;adj[u].push_back(v);adj[v].push_back(u);}std::vector<int> ans(N);auto dfs = [&](auto &&self, int x, int p, int res) -> void{int t = his.size();res += merge(A[x], B[x]);ans[x] = res;for (int y : adj[x]) {if (y != p) {self(self, y, x, res);}}revert(t);};dfs(dfs, 0, -1, 0);for (int i = 1; i < N; ++ i) {std::cout << ans[i] << " \n"[i + 1 == N];}return 0;
}
2.2 C. Envy
原题链接
C. Envy
思路分析
首先,对于Kruscal算法,我们无论按怎样的顺序 合并一组边,我们得到的图的连通性是一样的(只可能”形状“不同,但连通性一定相同)
对于所有MST,某种权值的边的数目是一定的(如果可以被替换为更小或更大的,那么该树不是MST)
对于一组查询,如果存在某个MST 包含这些边,我们可以这样check:
- 模拟Kruscal算法
- 当前合并完了权值小于 x 的边权,检查完了查询中权值为x的边权
- 如果查询中所有边权为x 的边都合并成功,那么说明这些边是必须的,一定存在某个MST包含这些边,我们合并完剩余边权为x的边后继续往后check
- 否则查询非法
对于单个查询的处理复杂度是 O(mlogn) 即Kruscal的复杂度
对于多组查询,我们考虑离线,仍然按边权模拟Kruscal
不过不同的是,我们把普通并查集换成可撤销并查集,check完一组边后,我们回退到check前的时间戳
check完所有查询中该边权的边后,我们再去正常的合并原图中边权为x的边
时间复杂度:O(qlogk + V + mlogn)
AC代码
#include <bits/stdc++.h>using i64 = long long;struct DSU {std::vector<int> siz;std::vector<int> f;std::vector<std::pair<int, int>> his;DSU(int n) : siz(n, 1), f(n) {std::iota(f.begin(), f.end(), 0);}int find(int x) {while (f[x] != x) {x = f[x];}return x;}bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) {return false;}if (siz[x] < siz[y]) {std::swap(x, y);}his.emplace_back(x, y);siz[x] += siz[y];f[y] = x;return true;}int time() {return his.size();}void revert(int tm) {while (his.size() > tm) {auto [x, y] = his.back();his.pop_back();f[y] = y;siz[x] -= siz[y];}}int size(int x) {return siz[find(x)];}
};int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, m;std::cin >> n >> m;std::vector<int> u(m), v(m), w(m);for (int i = 0; i < m; ++ i) {std::cin >> u[i] >> v[i] >> w[i];-- u[i], -- v[i];}const int V = std::ranges::max(w) + 1;std::vector<std::vector<int>> e(V);for (int i = 0; i < m; ++ i) {e[w[i]].push_back(i);}std::vector<std::vector<std::pair<int, std::vector<int>>>> g(V);int q;std::cin >> q;for (int i = 0; i < q; ++ i) {int k;std::cin >> k;std::vector<int> a(k);for (int j = 0; j < k; ++ j) {std::cin >> a[j];-- a[j];}std::ranges::sort(a, {}, [&](int i){return w[i];});for (int l = 0, r = 0; l < k; l = r) {while (r < k && w[a[l]] == w[a[r]]) {++ r;}g[w[a[l]]].emplace_back(i, std::vector<int>(a.begin() + l, a.begin() + r));}}DSU dsu(n);std::vector<bool> ans(q, true);for (int x = 1; x < V; ++ x) {for (auto &[i, a] : g[x]) {int tim = dsu.time();std::vector<std::pair<int, int>> p;p.reserve(a.size());for (int j : a) {p.emplace_back(u[j], v[j]);}for (auto &[X, Y] : p) {if (!dsu.merge(X, Y)) {ans[i] = false;}}dsu.revert(tim);}for (int i : e[x]) {dsu.merge(u[i], v[i]);}}for (int i = 0; i < q; ++ i) {std::cout << (ans[i] ? "YES\n" : "NO\n");}return 0;
}
2.3 C. Team-Building
原题链接
C. Team-Building
思路分析
显然可以用扩展域并查集来判断二分图
考虑先去掉不满足二分图的组
对于剩下的组数记为cnt,那么有 cnt * (cnt - 1) / 2 对
我们只需计算不满足二分图的配对
直觉上似乎对数很多,没法算,事实上,我们从边的角度来分析的话,其实需要计算的对数很少。
对于一条边,他连接的两个组别已经确定了,所以我们按照边连接的 组的编号对进行排序,只需处理按照连接的组的编号对分段处理即可。
时间复杂度:O(m(logm + logn))
AC代码
#include <bits/stdc++.h>using i64 = long long;struct DSU {std::vector<int> siz;std::vector<int> f;std::vector<std::pair<int, int>> his;DSU(int n) : siz(n, 1), f(n) {std::iota(f.begin(), f.end(), 0);}int find(int x) {while (f[x] != x) {x = f[x];}return x;}bool merge(int x, int y) {x = find(x);y = find(y);if (x == y) {return false;}if (siz[x] < siz[y]) {std::swap(x, y);}his.emplace_back(x, y);siz[x] += siz[y];f[y] = x;return true;}int time() {return his.size();}void revert(int tm) {while (his.size() > tm) {auto [x, y] = his.back();his.pop_back();f[y] = y;siz[x] -= siz[y];}}int size(int x) {return siz[find(x)];}bool same(int x, int y) {return find(x) == find(y);}
};int main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int n, m, k;std::cin >> n >> m >> k;std::vector<int> c(n);for (int i = 0; i < n; ++ i) {std::cin >> c[i];-- c[i];}DSU dsu(2 * n);std::vector<int> a(m), b(m);std::vector<bool> good(k, true);for (int i = 0; i < m; ++ i) {std::cin >> a[i] >> b[i];-- a[i], -- b[i];if (c[a[i]] > c[b[i]]) {std::swap(a[i], b[i]);}if (c[a[i]] == c[b[i]]) {dsu.merge(a[i], b[i] + n);dsu.merge(a[i] + n, b[i]);if (dsu.same(a[i], b[i]) || dsu.same(a[i] + n, b[i] + n)) {good[c[a[i]]] = false;}}}int cnt = std::reduce(good.begin(), good.end(), 0);i64 ans = cnt * (cnt - 1LL) / 2;std::vector<int> p(m);std::ranges::iota(p, 0);std::ranges::sort(p, {}, [&](int i){return std::pair(c[a[i]], c[b[i]]);});for (int i = 0, j = 0; i < m; i = j) {while (j < m && c[a[p[i]]] == c[a[p[j]]] && c[b[p[i]]] == c[b[p[j]]]) ++ j;if (c[a[p[i]]] != c[b[p[i]]] && good[c[a[p[i]]]] && good[c[b[p[i]]]]) {int tim = dsu.time();for (int x = i; x < j; ++ x) {dsu.merge(a[p[x]], b[p[x]] + n);dsu.merge(a[p[x]] + n, b[p[x]]);if (dsu.same(a[p[x]], b[p[x]]) || dsu.same(a[p[x]] + n, b[p[x]] + n)) {-- ans;break;}}dsu.revert(tim);}}std::cout << ans << "\n";return 0;
}
相关文章:
可撤销并查集,原理分析,题目练习
零、写在前面 可撤销并查集代码相对简单,但是使用场景往往比较复杂,经常用于处理离线查询,比较经典的应用是结合线段树分治维护动态连通性问题。在一些较为综合的图论问题中也经常出现。 前置知识:并查集,扩展域并查…...
中介者模式(Mediator Pattern)详解
文章目录 1. 中介者模式概述1.1 定义1.2 基本思想2. 中介者模式的结构3. 中介者模式的UML类图4. 中介者模式的工作原理5. Java实现示例5.1 基本实现示例5.2 飞机空中交通控制示例5.3 GUI应用中的中介者模式6. 中介者模式的优缺点6.1 优点6.2 缺点7. 中介者模式的适用场景8. 中介…...
Java网络编程:深入剖析UDP数据报的奥秘与实践
在浩瀚的计算机网络世界中,数据传输协议扮演着至关重要的角色。其中,用户数据报协议(UDP,User Datagram Protocol)以其独特的“轻量级”和“无连接”特性,在众多应用场景中占据了一席之地。与更为人熟知的传输控制协议(TCP,Transmission Control Protocol)相比,UDP提…...
17.thinkphp的分页功能
一.分页功能 1.不管是数据库操作还是模型操作,都使用paginate()方法来实现(第一种方式); //查找user表所有数据,每页显示5条 returnView::fetch(index, [list > User::paginate(5)]); 页数: 2.创建一个静态模版页面…...
Pandas比MySQL快?
知乎上有人问,处理百万级数据,Python列表、Pandas、Mysql哪个更快? Pands是Python中非常流行的数据处理库,拥有大量用户,所以拿它和Mysql对比也是情理之中。 实测来看,MySQL > Pandas > Python列表…...
问题 | 低空经济未来发展前景机遇及挑战
低空经济 **一、发展前景与机遇**1. **政策红利加速释放,顶层设计逐步完善**2. **技术突破驱动商业化落地**3. **应用场景多元化拓展**4. **万亿级市场潜力** **二、主要挑战**1. **空域管理与安全监管难题**2. **技术瓶颈与产业链短板**3. **法规与标准体系待完善*…...
Matlab 分数阶PID控制
1、内容简介 Matlab218-分数阶PID控制 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
如何对 Oracle 日志文件进行校验
目录 一、基本概述 二、基础知识 1、工具介绍 (1)BBED (2)dump 2、数据解析 (1)BLOCK 0 (2)BLOCK 1 (3)Block n( >=2 ) (4)redo record header (5)redo change 1)redo change header 2)redo change length list (6)Example 三、参考代码…...
从零开始用 AI 编写一个复杂项目的实践方法论
从零开始用 AI 编写一个复杂项目的实践方法论 这篇文章我用ai润色了一下,但是初稿是完全由我个人整理的逻辑思路,不是完全由ai生成的。其中内容也确实是我在实践中遇到问题、解决问题、总结出来的经验。 在从零开发一个复杂项目时,直接把目标…...
k8s监控方案实践(一):部署Prometheus与Node Exporter
k8s监控方案实践(一):部署Prometheus与Node Exporter 文章目录 k8s监控方案实践(一):部署Prometheus与Node Exporter一、Prometheus简介二、PrometheusNode Exporter实战部署1. 创建Namespace(p…...
2.5 特征值与特征向量
本章围绕特征值、特征向量及其应用展开,是线性代数的核心章节之一。以下从四个核心考点系统梳理知识体系: 考点一:矩阵的特征值与特征向量 1. 计算方法 具体矩阵: 解特征方程 ∣ λ E − A ∣ 0 |\lambda E - A| 0 ∣λE−A∣…...
从简历筛选到面试管理:开发一站式智能招聘系统源码详解
当下,如何打造一款高效、精准的一站式智能招聘系统,成为了很多人力资源科技公司和创业团队关注的焦点。在这篇文章中,将带你深入了解如何从零开始开发一款智能招聘系统源码,涵盖从简历筛选到面试管理的全流程。 一、招聘系统的核心…...
10.进程控制(下)
一、进程程序替换(重点) 在程序替换过程中,并没有创建新的进程,只是把当前进程的代码和数据用新程序的代码和数据进行覆盖式的替换。 1)一旦程序替换成功,就去执行新代码了,后序代码不执行 2&am…...
【Python 字符串】
Python 中的字符串(str)是用于处理文本数据的基础类型,具有不可变性、丰富的内置方法和灵活的操作方式。以下是 Python 字符串的核心知识点: 一、基础特性 定义方式: s1 单引号字符串 s2 "双引号字符串" s…...
最新CDGP单选题(第四章)补充
31、 [单选] 企业数据模型主题域的识别准则必须在整个企业模型中保持一致,以下哪项是常用的主题域识别准则: A:使用规范化规则,从系统组合中分离主题域...
Cursor降智找不到文件(Cursor降智)
文章目录 明明提供了上下文,却找不到文件! 明明提供了上下文,却找不到文件! 解决办法,删除codebase index,最好再把那个Index new folders by default给设置为Disabled。 这样设置貌似就不会出现找不到文件…...
Python基于Django和MySQL实现突发公共卫生事件舆情分析系统(有大屏功能)
说明:这是一个系统实战项目(附带代码文档安装讲解),如需代码文档安装讲解可以直接到文章最后关注获取。 系统演示如下: Python基于Django和MySQL实现突发公共卫生事件舆情分析系统(有大屏功能) 项目背景 随着互联网的…...
cat、more和less的区别
在 Linux 系统中,cat、more 和 less 都是用于查看文件内容的命令,但它们在功能和使用场景上有显著区别。以下是它们的详细对比: 1. cat 命令 功能: - 直接输出整个文件:一次性将文件内容全部显示在终端上ÿ…...
Python cv2特征检测与描述:从理论到实战
在计算机视觉领域,特征检测与描述是图像匹配、物体识别、SLAM等任务的核心技术。本文将结合OpenCV的cv2库,系统讲解特征检测与描述的原理,并通过Python代码演示主流算法的实现。 一、为什么需要特征检测与描述? 图像本质是像素矩…...
实践005-Gitlab CICD全项目整合
文章目录 环境准备环境准备集成Kubernetes Gitlab CICD项目整合项目整合整合设计 后端Java项目部署后端Java项目静态检查后端Java项目镜像构建创建Java项目部署文件创建完整流水线 前端webui项目部署前端webui项目镜像构建创建webui项目部署文件创建完整流水线 构建父子类型流水…...
为了摸鱼和吃瓜,我开发了一个网站
平时上班真的比较累,摸鱼和吃瓜还要跳转多个平台的话,就累上加累了。 所以做了一个聚合了全网主流平台热搜的网站。 目前市面上确实有很多这种网站了,所以目前最主要有两点和他们不同: 给热搜列表增加了配图,刷的时候…...
React -> AI组件 -> 调用Ollama模型, qwen3:1.7B非常聪明
使用 React 搭建一个现代化的聊天界面,支持与 Ollama 本地部署的大语言模型进行多轮对话。界面清爽、功能完整,支持 Markdown 渲染、代码高亮、<think> 隐藏思考标签、流式渐进反馈、暗黑模式适配等特性。 🧩 核心功能亮点 ✅ 模型选择…...
算法中的数学:约数
1.求一个整数的所有约数 对于一个整数x,他的其中一个约数若为i,那么x/i也是x的一个约数。而其中一个约数的大小一定小于等于根号x(完全平方数则两个约数都为根号x),所以我们只需要遍历到根号x,然后计算出另…...
性能远超SAM系模型,苏黎世大学等开发通用3D血管分割基础模型
如果把人的身体比作一座庞大的城市,那么血管无疑就是这座城市的「道路」,动脉、静脉以及毛细血管对应着高速公路、城市道路以及乡间小道,它们相互协作,通过血液将营养物质、氧气等输送到身体各处,从而维持着这座「城市…...
对 Kotlin 中的 data 关键字的理解,相比于普通类有哪些特点?
Kotlin 中的 data 关键字用于声明数据类(Data Class),它专门为简化数据模型的实现而设计的。 1 主构造函数必须至少有一个参数,且参数标记为 val 或 var 数据类的主构造函数必须至少有一个参数,并且这些参数必须使用…...
电厂参与全球能源效率排名的方法
在全球积极推动可持续能源发展的大背景下,电厂参与全球能源效率排名,对提升自身竞争力、推动行业进步意义重大。这不仅有助于电厂明确自身在全球能源领域的地位,还能促进其通过能效对标,学习先进经验,实现节能减排与高…...
〖 Linux 〗解决 VS Code 远程连接服务器的常见问题
文章目录 解决 VS Code 远程连接服务器的断开问题VS Code Remote-SSH一直弹出输入密码的问题VsCode C 语法检测失效不标红色波浪线 解决办法卸载扩展方式: 解决vscode C智能提示缓慢 解决 VS Code 远程连接服务器的断开问题 解决 vscode 卡顿,卡死&…...
谷歌 Gemma 大模型安装步骤
1.下载OllamaSetup安装包 下载地址:https://ollama.com/download 这里已Windows系统为例: 2.安装OllamaSetup客户端 3.部署大模型 在系统搜索栏里面,搜索cmd并打开 根据电脑实际配置情况选择对应的模型进行安装 【1】. 普通7B版 安装指…...
【Linux修炼手册】Linux开发工具的使用(一):yum与vim
文章目录 一、Linux 软件包管理器——yum安装与卸载的使用方法查看软件包 二、Linux编辑器——vimvim命名模式常用指令底行模式常用指令 一、Linux 软件包管理器——yum Linux安装软件的方式有3种: 源代码安装——成本极高rmp安装——具有安装依赖、安装源、安装版…...
JAVA房屋租售管理系统房屋出租出售平台房屋销售房屋租赁房屋交易信息管理源码
一、源码描述 这是一套房屋租售管理源码,基于SpringBootVue框架,后端采用JAVA开发,源码功能完善,涵盖了房屋租赁、房屋销售、房屋交易等业务。 二、源码截图...
XL32F001国产低成本单片机,24MHz主频,24KB Flash,3KB SRAM
XL32F001 是一颗基于ARM Cortex-M0内核的32 位微控制器,专为低成本、低功耗、小型化嵌入式系统设计,适合对资源需求中等但强调性价比和能效的场景。主频可达24M,内存方面有24KB Flash和3KB SRAM,适用于资源需求不大的应用场景。1.…...
k8s术语之job
Job类型 Kubernetes支持以下几种Job: 非并行Job:通常创建一个Pod直至其成功结束 固定结束次数的Job:设置.spec.completions,创建多个 Pod,直到 .spec.completions 个 Pod 成功结束 带有工作队列的并行Job:设置.spec.Parallelism 但…...
单片机-STM32部分:8、外部中断
飞书文档https://x509p6c8to.feishu.cn/wiki/ENFswNTSGiblehkIMtfc9dYinqh 创建工程 按工程创建章节步骤,把工程创建好,并配置外部时钟源,SWD调试模式,时钟72MHz。 设置引脚模式 找到需要配置的按键,例如PC2&#…...
电子电器架构 --- 电气/电子架构如何发展以满足其处理和传感器融合需求
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...
WordPress插件:WPJAM Basic优化设置
WPJAM Basic 插件的「优化设置」是我爱水煮鱼博客多年使用 WordPress 的经验而整理的各类优化设置。 一、功能屏蔽 功能屏蔽就是屏蔽一些WordPress中用不上、难用的功能,目前的支持屏蔽以下功能: (1)屏蔽文章修订功能 文章修…...
数字电子技术基础(五十六)——JK触发器
目录 1 JK触发器 2 使用Digital软件来绘制JK触发器 1 JK触发器 对于D触发器来说,其功能是过于简单了,D触发器只有置0和置1的操作,而JK触发器相对于D触发器处理原来的保持、置位和复位的操作,还增加了翻转操作。JK触发器通过优化…...
python小说网站管理系统-小说阅读系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核…...
Python程序,输入IP,扫描该IP哪些端口对外是开放的,输出端口列表
#!/usr/bin/env python # -*- coding: utf-8 -*-""" IP端口扫描程序 输入IP地址,扫描该IP哪些端口对外是开放的,输出端口列表 """import socket import sys import concurrent.futures import ipaddress from tabulate im…...
极狐GitLab 容器镜像仓库功能介绍
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 极狐GitLab 容器镜像库 (BASIC ALL) 您可以使用集成的容器镜像库,来存储每个极狐GitLab 项目的容器镜像。 要为您…...
【嵌入式开发-IIC】
嵌入式开发-IIC ■ IIC简介■ IIC ■ IIC简介 ■ IIC...
能见度测量仪:能适应各种恶劣天气状况
云境天合TH-BN10能见度测量仪是一种用于测量大气能见度的专业仪器,在气象观测、交通运输、航空航海等领域发挥着关键作用。 能见度即目标物的能见距离,指观测目标物时,能从背景上分辨出目标物轮廓的最大距离,是重要的气象观测要素…...
运维打铁:服务器分类及PHP入门
文章目录 C/S架构和B/S架构C/S架构B/S架构 服务器分类服务器类型服务器软件 使用 WampServer 搭建 HTTP服务集成环境的分类WampServer 的安装测试访问配置网站根目录 静态网站和动态网站PHP的常见语法第一段 php 代码注释变量数据类型运算符函数的定义类和对象内容输出循环语句…...
SpringBoot应急知识学习系统开发实现
概述 一个基于SpringBoot开发的应急知识学习系统,该系统提供了完整的用户注册、登录、知识学习与测评功能。对于开发者而言,这是一个值得参考的免费Java源码项目,可以帮助您快速构建类似的教育平台。 主要内容 5.2 注册模块的实现 系统采…...
系统思考助力富维东阳
刚刚完成了长春一家汽车零配件公司关于系统思考的项目! 在开班仪式上,公司总经理深刻阐述了项目的背后意义,强调了系统思考与公司战略的紧密联系。这不仅是一次培训,更是一次关于“如何全方位看待问题”的深度对话。 在这个过程中…...
《供应链网络攻击的风险与防范》
中国古语有云:“千里之堤,溃于蚁穴。”供应链攻击正是利用这种系统性弱点发起攻势。近年来,随着国内数字化转型加速,供应链安全问题频发。从某盟删库事件到某头部物流企业数据泄露,从某国产工业软件遭恶意代码植入到某…...
【MySQL】进阶知识详解
目录 引言一、约束:数据完整性的守护者1.1 约束的作用与分类1.2 约束的语法详解非空约束唯一约束主键约束外键约束1.3 约束实战案例二、数据库设计:表关系的艺术2.1 三种核心表关系一对多(部门-员工)多对多(学生-课程)一对一(用户-详情)三、多表查询:数据关联的桥梁3.…...
SpringBoot中使用MCP和通义千问来处理和分析数据-连接本地数据库并生成实体类
文章目录 前言一、正文1.1 项目结构1.2 项目环境1.3 完整代码1.3.1 spring-mcp-demo的pom文件1.3.2 generate-code-server的pom文件1.3.3 ChatClientConfig1.3.4 FileTemplateConfig1.3.5 ServiceProviderConfig1.3.6 GenerateCodeController1.3.7 Columns1.3.8 Tables1.3.9 Fi…...
算法每日一题 | 入门-分支结构-Apples Prologue/苹果和虫子
Apples Prologue/苹果和虫子 题目描述 小 B 喜欢吃苹果。她现在有 m m m(1 ≤ m ≤100)个苹果,吃完一个苹果需要花费 t t t(0 ≤ t≤ 100)分钟,吃完一个后立刻开始吃下一个。 现在时间过去了 s s s&a…...
浙大与哈佛联合开源图像编辑模型IC-Edit,实现高效、精准、快速的指令编辑~
项目背景 研究动机与目标 ICEdit(In-Context Edit)由浙江大学团队开发,旨在通过自然语言指令实现高效、精准的图像编辑,降低对大规模训练数据和计算资源的需求。传统图像编辑方法(如基于微调的扩散模型或无训练技术&…...
查看jdk是否安装并且配置成功?(Android studio安装前的准备)
WinR输入cmd打开命令提示窗口 输入命令 java -version 回车显示如下:...