基环树学习笔记

理论基础:

内向基环树就是每个联通块有且仅有一个环,并且出度为1的有向图,每一个内向基环树都是由联通环和指向联通环的树枝组成。而且基环可以只有两个节点构成。

Leetcode - 2127:参加会议的最多员工数

题目:

一个公司准备组织一场会议,邀请名单上有 n 位员工。公司准备了一张 圆形 的桌子,可以坐下 任意数目 的员工。

员工编号为 0 到 n - 1 。每位员工都有一位 喜欢 的员工,每位员工 当且仅当 他被安排在喜欢员工的旁边,他才会参加会议。每位员工喜欢的员工 不会 是他自己。

给你一个下标从 0 开始的整数数组 favorite ,其中 favorite[i] 表示第 i 位员工喜欢的员工。请你返回参加会议的 最多员工数目 。

示例 1:

输入:favorite = [2,2,1,2]
输出:3
解释:
上图展示了公司邀请员工 0,1 和 2 参加会议以及他们在圆桌上的座位。
没办法邀请所有员工参与会议,因为员工 2 没办法同时坐在 0,1 和 3 员工的旁边。
注意,公司也可以邀请员工 1,2 和 3 参加会议。
所以最多参加会议的员工数目为 3 。

笔记:

这是一道标准的基环图题目,用到了拓扑排序和分类讨论的方法:

首先明确题目的要求,让我们求出参加会议的最多人数,我们就可以将提供的favorite数组转变成一个有向图,这样我们就可以想到这是一个内向基环图,为什么呢?我们可以这么想:首先我们假想图中存在一个基环,那么基环内的所有节点必定是互相连接,不可能出现出边连接非基环内的节点,接着我们向图中加入非基环边,那么这些边一定是存在连接基环的边的。

知道这是一个内向基环图之后,我们就可以思考参加会议的人数,这个参加会议的人的可能性有三种,一种是在基环上的所有节点,这些人可以参加会议,一种是当基环节点数为2时,这是参加会议的人数为基环上的两个点加上这两点的树枝长度。

所以经过上面的分析我们要判断的情况有两种,一种是存在一个或者多个基环的图,我们需要选择节点数最多的那个基环,一种是树枝加两节点基环的总结点数 。所以就是在这两种情况系选择节点数最多的那个。

对于第一种情况,求图中基环的大小,我们可以采用拓扑排序,将树枝节点和基环分隔开,求出所有基环的大小进行比较得出最大基环大小。

第二种情况:我们需要进行判断如果当前基环的大小为2,那么我们就将该情况参加会议人数加上这两点的树枝大小,最后对这两种情况进行比较。

class Solution {
public:int maximumInvitations(vector<int> &favorite) {int n = favorite.size();vector<int> deg(n);for (int f: favorite) {deg[f]++; // 统计基环树每个节点的入度}vector<vector<int>> rg(n); // 反图queue<int> q;for (int i = 0; i < n; i++) {if (deg[i] == 0) {q.push(i);}}while (!q.empty()) { // 拓扑排序,剪掉图上所有树枝int x = q.front();q.pop();int y = favorite[x]; // x 只有一条出边rg[y].push_back(x);if (--deg[y] == 0) {q.push(y);}}// 通过反图 rg 寻找树枝上最深的链,求树枝的大小function<int(int)> rdfs = [&](int x) -> int {int max_depth = 1;for (int son: rg[x]) {max_depth = max(max_depth, rdfs(son) + 1);}return max_depth;};int max_ring_size = 0, sum_chain_size = 0;for (int i = 0; i < n; i++) {if (deg[i] == 0) continue; // 树枝节点直接跳过// 遍历基环上的点deg[i] = 0; // 将基环上的点的入度标记为 0,避免重复访问int ring_size = 1; // 基环长度// 求当前遍历节点i所在的基环的大小for (int x = favorite[i]; x != i; x = favorite[x]) {deg[x] = 0; // 将基环上的点的入度标记为 0,避免重复访问ring_size++;}if (ring_size == 2) { // 基环长度为 2sum_chain_size += rdfs(i) + rdfs(favorite[i]); // 累加两条最长链的长度} else {max_ring_size = max(max_ring_size, ring_size); // 取所有基环长度的最大值}}return max(max_ring_size, sum_chain_size);}
};作者:灵茶山艾府
链接:https://leetcode.cn/problems/maximum-employees-to-be-invited-to-a-meeting/solutions/1187830/nei-xiang-ji-huan-shu-tuo-bu-pai-xu-fen-c1i1b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

下面是自己写的版本:

class Solution {
public:int branch_len(vector<vector<int>>& rev, int& x){int n = rev[x].size();int len = 1;for(int i = 0; i < n; i++){// branch_len是遍历当前i节点的树枝,而max的作用是比较所有的树枝选出最大的。len = max(len, branch_len(rev, rev[x][i]) + 1);}return len;}int maximumInvitations(vector<int>& favorite) {int n = favorite.size();// 统计各节点入度:vector<int> indeg(n, 0);for(int i = 0; i < n; i++){indeg[favorite[i]]++;}queue<int> que;for(int i = 0; i < n; i++){if(indeg[i] == 0){que.push(i);}}// 建立一个反图便于从树枝连接基环处向下遍历到底从而求出大小:vector<vector<int>> rev(n);while(!que.empty()){int cur = que.front();  que.pop();int y = favorite[cur];indeg[y]--;rev[y].push_back(cur);if(indeg[y] == 0){que.push(y);}}int res_1 = 0;// 基环大小大于二的情况int res_2 = 0;// 基环大小等于二的情况for(int i = 0; i < n; i++){// 遍历所有节点找到基环,找到后将该点标记为已访问过if(indeg[i] == 0)   continue;indeg[i] = 0;int loop_len = 1;// 求基环大小:for(int j = favorite[i]; j != i; j = favorite[j]){loop_len++;indeg[j] = 0;}if(loop_len == 2){// 当基环大小等于二时,可邀请的人可以是这两个基环节点所连接的边// 那如果基环节点链接了多个树枝呢?// 只能选择最长的链:这两个节点喜欢的节点都是那个基环节点,但基环节点左右左右两个位置可以坐人,左边已经坐了基环节点喜欢的节点,那么右边只能坐一个。res_1 += branch_len(rev, i) + branch_len(rev, favorite[i]);}else{res_2 = max(res_2, loop_len);}}return max(res_1, res_2);}
};

Leetcode - 684:冗余连接

题目:

树可以看成是一个连通且 无环 的 无向 图。

给定往一棵 n 个节点 (节点值 1~n) 的树中添加一条边后的图。添加的边的两个顶点包含在 1 到 n 中间,且这条附加的边不属于树中已存在的边。图的信息记录于长度为 n 的二维数组 edges ,edges[i] = [ai, bi] 表示图中在 ai 和 bi 之间存在一条边。

请找出一条可以删去的边,删除后可使得剩余部分是一个有着 n 个节点的树。如果有多个答案,则返回数组 edges 中最后出现的那个。

示例 1:

输入: edges = [[1,2], [1,3], [2,3]]
输出: [2,3]

笔记:

这道题需要在并查集模板上进行一定的修改:在将当前遍历到的两点进行合并加入到并查集的过程中我们需要习判断一下当前两个点是否在同一个连通分量中,也就是两点是否为同一根节点,如果两者属于同一连通分量那么这两点的连线边就可以去掉,不影响所有点相连。如果两点不在同一分量那么就将两点加入到并查集中。

class Solution {
public:// 并查集模板:vector<int> father;void init(int n){father = vector<int>(n + 1, 0);for(int i = 1; i <= n; i++){father[i] = i;}}int find(int x){return x == father[x] ? x : father[x] = find(father[x]);}void join(int u, int v){u = find(u);v = find(v);if(u == v){return;}father[v] = u;};vector<int> findRedundantConnection(vector<vector<int>>& edges) {init(edges.size());vector<int> res;for(int i = 0; i < edges.size(); i++){int x = edges[i][0];int y = edges[i][1];// 检查当前两点是否为同一联通分量:if(find(x) != find(y)){join(x,y);}else{res = edges[i];}}return res;}
};

Leetcode - 2359:找到里给定两个节点最近的距离:

题目:

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,每个节点 至多 有一条出边。

有向图用大小为 n 下标从 0 开始的数组 edges 表示,表示节点 i 有一条有向边指向 edges[i] 。如果节点 i 没有出边,那么 edges[i] == -1 。

同时给你两个节点 node1 和 node2 。

请你返回一个从 node1 和 node2 都能到达节点的编号,使节点 node1 和节点 node2 到这个节点的距离 较大值最小化。如果有多个答案,请返回 最小 的节点编号。如果答案不存在,返回 -1 。

注意 edges 可能包含环。

示例 1:

输入:edges = [2,2,3,-1], node1 = 0, node2 = 1
输出:2
解释:从节点 0 到节点 2 的距离为 1 ,从节点 1 到节点 2 的距离为 1 。
两个距离的较大值为 1 。我们无法得到一个比 1 更小的较大值,所以我们返回节点 2 。

笔记:

这道题的思路就是求出node1和node2到各个点的距离,然后找出这些距离中的最小值。

class Solution {
public:// 求出node1和node2到各个点的距离vector<int> find_len(vector<int>& edges, int x){int n = edges.size();int d = 0;vector<int> len(n, n);// 遍历的要求:该节点不为最后的节点并且该节点未被访问过while(x >= 0 && len[x] == n){len[x] = d++;x = edges[x];}return len;}int closestMeetingNode(vector<int>& edges, int node1, int node2) {int n = edges.size();int res = n;int ans = -1;vector<int> a(n, n);a = find_len(edges, node1);vector<int> b(n, n);b = find_len(edges, node2);for(int i = 0; i < n; i++){int d = max(a[i], b[i]);if(d < res){res = d;ans = i;}}return ans;}
};

Leetcode - 2360:图中的最长环:

题目:

给你一个 n 个节点的 有向图 ,节点编号为 0 到 n - 1 ,其中每个节点 至多 有一条出边。

图用一个大小为 n 下标从 0 开始的数组 edges 表示,节点 i 到节点 edges[i] 之间有一条有向边。如果节点 i 没有出边,那么 edges[i] == -1 。

请你返回图中的 最长 环,如果没有任何环,请返回 -1 。

一个环指的是起点和终点是 同一个 节点的路径。

示例 1:

输入:edges = [3,3,4,2,3]
输出去:3
解释:图中的最长环是:2 -> 4 -> 3 -> 2 。
这个环的长度为 3 ,所以返回 3 。

笔记:

这道题就是参加会议的最多员工数那道题的简易版本,也就是去除了考虑基环为2的座位问题,只考虑大小>= 2的基环的大小。

思路是:利用拓扑排序去除掉非基环的树枝部分,然后循环遍历所有点找到所有的基环,通过比较得出最大的那个基环。

这道题需要注意的一个点是:当edges[i] = -1时的处理情况:没有出边就代表必定不能成环所以我们直接忽略这条边。

class Solution {
public:int longestCycle(vector<int>& edges) {int n = edges.size();vector<int> indeg(n, 0);// 计算每个节点的入度for(int i = 0; i < n; i++){if (edges[i] != -1) { // 忽略指向 -1 的边indeg[edges[i]]++;}}queue<int> que;// 找出所有入度为0的节点for(int i = 0; i < n; i++){if(indeg[i] == 0){que.push(i);}}// 拓扑排序去除所有入度为0的节点while(!que.empty()){int cur = que.front();  que.pop();int y = edges[cur];if (y != -1) { // 忽略指向 -1 的边indeg[y]--;if(indeg[y] == 0){que.push(y);}}}int res = -1; // 用 -1 表示没有环的情况// 寻找剩余的节点中的最长环for(int i = 0; i < n; i++){if(indeg[i] == 0) continue; // 跳过已处理的节点int len = 0;for(int j = i; indeg[j] > 0; j = edges[j]) {indeg[j] = 0; // 标记节点为已访问len++;}res = max(res, len);}return res;}
};

Leetcode - 2876:有向图访问计数:

题目:

现有一个有向图,其中包含 n 个节点,节点编号从 0 到 n - 1 。此外,该图还包含了 n 条有向边。

给你一个下标从 0 开始的数组 edges ,其中 edges[i] 表示存在一条从节点 i 到节点 edges[i] 的边。

想象在图上发生以下过程:

  • 你从节点 x 开始,通过边访问其他节点,直到你在 此过程 中再次访问到之前已经访问过的节点。

返回数组 answer 作为答案,其中 answer[i] 表示如果从节点 i 开始执行该过程,你可以访问到的不同节点数。

示例 1:

输入:edges = [1,2,0,0]
输出:[3,3,3,4]
解释:从每个节点开始执行该过程,记录如下:
- 从节点 0 开始,访问节点 0 -> 1 -> 2 -> 0 。访问的不同节点数是 3 。
- 从节点 1 开始,访问节点 1 -> 2 -> 0 -> 1 。访问的不同节点数是 3 。
- 从节点 2 开始,访问节点 2 -> 0 -> 1 -> 2 。访问的不同节点数是 3 。
- 从节点 3 开始,访问节点 3 -> 0 -> 1 -> 2 -> 0 。访问的不同节点数是 4 。

笔记:

这道题的难点和不同点在于当球树枝上的节点的访问计数时,我们会发现比较难处理,因为在参加会议的最多员工数拿到题目中,我们可以通过拓扑排序之后找到基环并通过基环的大小锁定需要求的熟知的根节点然后从根节点开始处理便可以求得这树枝的大小,而这道题我们无法定位到根节点。

若是在环上的节点我们可以直接遍历整个环求出计数,但在树枝上的点我们需要求出其深度还要求出与其相连的基环的大小:

本题的关键就在于我们需要处理的就这两种情况:

1、节点在树枝上不在基环上,这种情况计数为在树枝上的深度加上基环的大小。

2、节点在基环上,这种情况计数为基环的大小。

由于edges是内向基环图,所以我们需要建立一个返图方便我们从基环上的点向外dfs拓展,在这里我们在遍历反图时的基础深度设置为基环的大小方便我们处理,

对于多个基环的理解:我一开始是认为多个基环不就是一个基环么,但需要注意的是如果是两个基环通过一个节点数为2的基环相连接那么这是一个基环,如果不是节点数为2的基环连接那么就是两个独立的基环。

class Solution {
public:vector<int> countVisitedNodes(vector<int> &g) {int n = g.size();vector<vector<int>> rg(n); // 反图vector<int> deg(n);for (int x = 0; x < n; x++) {int y = g[x];rg[y].push_back(x);deg[y]++;}// 拓扑排序,剪掉 g 上的所有树枝// 拓扑排序后,deg 值为 1 的点必定在基环上,为 0 的点必定在树枝上queue<int> q;for (int i = 0; i < n; i++) {if (deg[i] == 0) {q.push(i);}}while (!q.empty()) {int x = q.front();q.pop();int y = g[x];if (--deg[y] == 0) {q.push(y);}}vector<int> ans(n, 0);// 在反图上遍历树枝:x:基环上的点也就是树枝的根:function<void(int, int)> rdfs = [&](int x, int depth) {ans[x] = depth;for (int y: rg[x]) {if (deg[y] == 0) { // 树枝上的点在拓扑排序后,入度均为 0rdfs(y, depth + 1);}}};// 关键代码:for (int i = 0; i < n; i++) {if (deg[i] <= 0) {continue;}vector<int> ring;for (int x = i;; x = g[x]) {deg[x] = -1; // 将基环上的点的入度标记为 -1,避免重复访问// 存储当前遍历的基环的所有节点:ring.push_back(x); // 收集在基环上的点if (g[x] == i) {break;}}// 对当前遍历的基环上的点通过反图向外dfs获取对应树枝的深度:for (int x: ring) {rdfs(x, ring.size()); // 为方便计算,以 ring.size() 作为初始深度}}return ans;}
};作者:灵茶山艾府
链接:https://leetcode.cn/problems/count-visited-nodes-in-a-directed-graph/solutions/2464852/nei-xiang-ji-huan-shu-pythonjavacgo-by-e-zrzh/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
class Solution {
public:// 求各节点的深度,树枝起始深度为基环的大小void brank_len(vector<int>& ans, vector<int>& indeg, vector<vector<int>>& rev, int x, int dep){int n = rev[x].size();ans[x] = dep;for(int i = 0; i < n; i++){brank_len(ans, indeg, rev, rev[x][i], dep + 1);}}vector<int> countVisitedNodes(vector<int>& edges) {int n = edges.size();vector<int> ans(n, 0);vector<int> indeg(n, 0);// 拓扑排序模板:for(int i = 0; i < n; i++){indeg[edges[i]]++;}queue<int> que;for(int i = 0; i < n; i++){if(indeg[i] == 0){que.push(i);}}vector<vector<int>> rev(n);// 建立反图while(!que.empty()){int cur = que.front(); que.pop();int y = edges[cur];rev[y].push_back(cur);if(--indeg[y] == 0){que.push(y);}}for(int i = 0; i < n; i++){if(indeg[i] == 0)   continue;vector<int> ring;indeg[i] = 0;ring.push_back(i);for(int j = edges[i]; j != i; j = edges[j]){indeg[j] = 0;ring.push_back(j);}for(int k = 0; k < ring.size(); k++){brank_len(ans, indeg, rev, ring[k], ring.size());}}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/17900.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【RabbitMQ】SpringAMQP--消息转换器

SpringAMQP–消息转换器 测试发送Object类型消息 1.声明队列 Configuration public class FanoutConfig {Beanpublic Queue objectQueue(){return new Queue("object.queue");} }运行消费者后&#xff1a; 2.发送消息 RunWith(SpringRunner.class) SpringBootTes…

【数据结构与算法】七大排序算法(上)

【数据结构与算法】七大排序算法(上) &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;数据结构与算法&#x1f345; &#x1f33c;文章目录&#x1f33c; 1. 排序的概念及应用 1.1 排序的概念 1.2 排序的应用 1.3 常见排序算法 2. 常…

开源博客项目Blog .NET Core源码学习(23:App.Hosting项目结构分析-11)

本文学习并分析App.Hosting项目中后台管理页面的标签管理页面、轮播图维护页面。 标签管理页面 标签管理页面用于显示、检索、新建、编辑、删除标签数据&#xff0c;以便在前台页面的首页及文章专栏等页面显示标签数据。标签管理页面附带一新建及编辑页面&#xff0c;以支撑新…

如同“水生态”的存储引擎|OceanBase数据转储合并技术解读(一)

本系列文章主要围绕 OceanBase数据库存储引擎中的转储合并进行解读&#xff0c;涉及到数据存储、转储合并、数据校验等方面的内容&#xff0c;旨在让读者了解OceanBase数据库的存储引擎中与转储合并有关的各种概念&#xff0c;帮助读者更好地理解OceanBase数据库的存储技术原理…

基于STM32实现智能饮水机控制系统

目录 引言环境准备智能饮水机控制系统基础代码示例&#xff1a;实现智能饮水机控制系统 温度传感器数据读取水泵和加热器控制水位传感器数据读取用户界面与显示应用场景&#xff1a;家庭和办公室的智能饮水管理问题解决方案与优化收尾与总结 1. 引言 本教程将详细介绍如何在S…

关于pdfbox读取pdf

最近&#xff0c;想着将pdf的文件进行读取其内容&#xff0c;发现了一个比较好用的依赖pdfbox。目前使用这个依赖&#xff0c;进行实现一个简单实例&#xff0c;如果之后需要使用到更深的了解&#xff0c;会进行更新。这里提醒一下&#xff1a;jdk8尽量采用pdfbox3.x版本。 对…

Linux一键安装Docker、kkfileviewer

Linux一键安装Docker、kkfileviewer 一、安装docker 安装docker脚本 vi initDocker.sh脚本内容 #安装前先更新yum&#xff0c;防止连接镜像失败 yum -y update#卸载系统之前的docker&#xff08;可选择&#xff0c;我这里直接注释了&#xff09; #yum remove docker docker…

香橙派KunpengPro测评之使用C语言操控40pin引脚

香橙派KunpengPro测评之使用C语言操控40pin引脚 香橙派KunpengPro介绍香橙派实物图香橙派登录界面香橙派KunpengPro的登录界面香橙派KunpengPro的原始桌面香橙派KunpengPro内安装了VScode等软件香橙派KunpengPro的终端 香橙派硬件参数核心性能图形与显示接口丰富性扩展与兼容性…

十四天学会Vue——Vue核心(理论+实战)上篇(第一天)

一、Vue核心&#xff08;上篇&#xff09; 热身tops&#xff1a;选取开发模式 ①用于开发模式 我们只需要知道 我们是开发模式&#xff0c;开发模式他会跟你提示代码出现错误的地方以及出错原因&#xff0c;而生产模式比较简洁。 ②用于生产模式 1.1 new Vue()实例 了解Vue&a…

数据库语法树优化

目录 一、σ、π、⋈ 1.选择σ 2.投影π 3.连接⋈ 二、 构建语法树 ① 解读sql语句 ② 写出关系代数表达式 ③ 画出语法树 三、优化语法树 四、练习 语法树优化方法 一、σ、π、⋈ 1.选择σ 选择就是在关系R中选择满足给定条件的诸元组。 通过条件SdeptIS选择出系别…

基于香橙派搭建家庭网盘

一、概述 家庭网盘是一种用于家庭用户的在线存储和文件共享服务。它允许家庭成员在云端存储、同步和分享照片、视频、文档等文件&#xff0c;方便快捷地访问和管理个人和家庭数据。家庭网盘通常提供安全可靠的数据存储和备份功能&#xff0c;保障用户数据的安全性。此外&#x…

一文解决弹窗交互设计难题,轻松上手

弹窗交互的分类 我们每天所说的弹出窗口是一个非常笼统的概念。我们习惯性地称所有的对话框、浮层和提示条为弹出窗口。事实上&#xff0c;弹出窗口可以分为两种类型&#xff1a;模态弹出框和非模态弹出框。在 UI 在设计中&#xff0c;当它迫使用户与之交互时&#xff0c;我们…

【算法】【二叉树,DFS,哈希集合,分类讨论】力扣1110. 删点成林

1110. 删点成林 文章目录 【算法】力扣【二叉树&#xff0c;DFS&#xff0c;哈希集合&#xff0c;分类讨论】1110. 删点成林题目描述示例 1&#xff1a;示例 2&#xff1a; 输入输出示例解释思路解析核心思想算法步骤复杂度分析 代码实现总结 【算法】力扣【二叉树&#xff0c…

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

马斯克xAI融资60亿美元,宣布打造世界第一超算中心,10万张H100GPU

昨天&#xff0c;埃隆马斯克的xAI初创公司宣布获得60亿美元的巨额融资&#xff0c;主要用于打造一台巨大的超级计算机&#xff0c;马斯克称之为“超级计算工厂”。 从创立OpenAI到如今的xAI&#xff0c;技术和算力的发展历经了几个时代&#xff0c;但似乎马斯克的吸金能力一直…

代码随想录算法训练营day21|530.二叉搜索树的最小绝对值差、501.二叉搜索树中的众数、236.二叉树的最近公共祖先

二叉搜索树的最小绝对值差 递归法 首先需考虑这是一个二叉搜索树&#xff0c;在中序遍历后的结果为从小到大的一个序列&#xff0c;寻找二叉搜索树的最小绝对值差&#xff0c;只需比较一个节点与之后的差值即可。在遍历的过程中&#xff0c;我们需要一个节点保存前节点…

短道速滑短视频:四川京之华锦信息技术公司

短道速滑短视频&#xff1a;冰雪激情的视觉盛宴 随着冬奥会的热度不断攀升&#xff0c;短道速滑作为其中一项紧张刺激、充满观赏性的运动&#xff0c;受到了越来越多人的关注。而在社交媒体和短视频平台的助力下&#xff0c;短道速滑短视频成为了人们了解、欣赏这项运动的新窗…

vxe-form-design 表单设计器的使用

vxe-form-design 在 vue3 中表单设计器的使用 查看官网 https://vxeui.com 安装 npm install vxe-pc-ui // ... import VxeUI from vxe-pc-ui import vxe-pc-ui/lib/style.css // ...// ... createApp(App).use(VxeUI).mount(#app) // ...使用 github vxe-form-design 用…

Python在忘mysql密码后该如何重新连mysql

步骤一 先到mysql的bin目录下 步骤二 用mysqld delete mysql 把之前的库删了 步骤三 通过管理员模式进去后 用命令mysqld --skip-grant-tables越过验证 再输入mysql -u root 直达账户 步骤四 用FLUSH PRIVILEGES; ALTER USER rootlocalhost IDENTIFIED BY new_password; 指…

Echarts x轴坐标二级分组

在使用echarts 封装组件的时候&#xff0c;偶尔会遇到需要x轴坐标进行二层分组的需求。那么如何对echarts 进行二层分组呢&#xff0c;有以下几个步骤&#xff1a; 仅介绍二层分组的逻辑。有兴趣的可以进行三层延伸。 1&#xff0c;修改echarts Options 中xAxis 的配置。 此…