当前位置: 首页 > news >正文

浙大陈越何钦铭数据结构08-图7 公路村村通【循环和最小堆版】

题目

现有村落间道路的统计数据表中,列出了有可能建设成标准公路的若干条道路的成本,求使每个村落都有公路连通所需要的最低成本。

输入格式:
输入数据包括城镇数目正整数N(≤1000)和候选道路数目M(≤3N);随后的M行对应M条道路,每行给出3个正整数,分别是该条道路直接连通的两个城镇的编号以及该道路改建的预算成本。为简单起见,城镇从1到N编号。

输出格式:
输出村村通需要的最低成本。如果输入数据不足以保证畅通,则输出−1,表示需要建设更多公路。

输入样例:
6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3
输出样例:
12

分析:
一个典型的最小生成树问题,可以用Prim或Kruskal实现,本文使用Prim用循环和最小堆2种方式实现。

循环代码:

#include <stdio.h>
#include <stdlib.h>#define MAX_VERTEX_NUM 1000
#define INFINITY 65535
#define ERROR -1typedef int Vertex;
typedef int WeightType;struct _Edge
{Vertex V, W;WeightType weight;
};
typedef struct _Edge *Edge;typedef struct _AdjNode *AdjNode;
struct _AdjNode
{Vertex adjV;WeightType weight;AdjNode next;
};typedef struct AdjTable
{AdjNode firstEdge;
} AdjTable[MAX_VERTEX_NUM];struct _LGraph
{int Nv, Ne;AdjTable graph;
};
typedef struct _LGraph *LGraph;LGraph CreateGraph(int vertexNum);
void InsertEdge(LGraph graph, Edge E);
LGraph BuildGraph(int vertexNum, int edgeNum);
Vertex FindMinDist(LGraph G, WeightType dist[]);
int Prim(LGraph graph, Vertex S);/*
08-图7 公路村村通
难度:1星6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3126 4
1 2 5
1 3 3
1 4 7
5 6 26 6
1 2 10
2 4 20
3 4 30
1 3 40
1 4 50
2 3 604 4
1 2 10
2 3 20
3 4 30
1 4 404 6
1 2 10
1 3 40
1 4 50
2 3 60
2 4 20
3 4 30
602 1
1 2 107 21
1 2 14
1 3 11
1 4 19
1 5 12
1 6 17
1 7 20
2 3 16
2 4 15
2 5 13
2 6 10
2 7 18
3 4 20
3 5 12
3 6 11
3 7 16
4 5 14
4 6 17
4 7 19
5 6 10
5 7 15
6 7 137 21
1 2 14
1 3 11
1 4 19
1 5 12
1 6 17
1 7 20
2 3 16
2 4 15
2 5 13
2 6 10
2 7 18
3 4 20
3 5 12
3 6 11
3 7 16
4 5 14
4 6 17
4 7 19
5 6 10
5 7 15
6 7 13*/int main()
{int N, M;scanf("%d %d", &N, &M);LGraph G = BuildGraph(N, M);printf("%d\n", Prim(G, 0));free(G);return 0;
}LGraph CreateGraph(int vertexNum)
{LGraph G;G = (LGraph)malloc(sizeof(struct _LGraph));G->Nv = vertexNum;G->Ne = 0;for (int V = 0; V < G->Nv; V++){G->graph[V].firstEdge = NULL;}return G;
}void InsertEdge(LGraph G, Edge E)
{AdjNode NewNode;NewNode = (AdjNode)malloc(sizeof(struct _AdjNode));NewNode->adjV = E->W;NewNode->weight = E->weight;NewNode->next = G->graph[E->V].firstEdge;G->graph[E->V].firstEdge = NewNode;NewNode = (AdjNode)malloc(sizeof(struct _AdjNode));NewNode->adjV = E->V;NewNode->weight = E->weight;NewNode->next = G->graph[E->W].firstEdge;G->graph[E->W].firstEdge = NewNode;
}LGraph BuildGraph(int vertexNum, int edgeNum)
{LGraph G = CreateGraph(vertexNum);G->Ne = edgeNum;Edge E;E = (Edge)malloc(sizeof(struct _Edge));for (int i = 0; i < G->Ne; i++){scanf("%d %d %d", &E->V, &E->W, &E->weight);E->V--;E->W--;InsertEdge(G, E);}free(E);return G;
}Vertex FindMinDist(LGraph G, WeightType dist[])
{ /* 返回未被收录顶点中dist最小者 */Vertex minV, V;WeightType minDist = INFINITY;for (V = 0; V < G->Nv; V++){if (dist[V] != 0 && dist[V] < minDist){/* 若V未被收录,且dist[V]更小 */minDist = dist[V]; /* 更新最小距离 */minV = V;          /* 更新对应顶点 */}}if (minDist < INFINITY) /* 若找到最小dist */return minV;        /* 返回对应的顶点下标 */elsereturn ERROR; /* 若这样的顶点不存在,返回-1作为标记 */
}int Prim(LGraph G, Vertex S)
{ // 只计算TotalWeight,无需实际创建生成树WeightType dist[G->Nv], totalWeight;Vertex V;AdjNode W;int vCount;for (V = 0; V < G->Nv; V++)dist[V] = INFINITY;for (W = G->graph[S].firstEdge; W; W = W->next)dist[W->adjV] = W->weight;totalWeight = 0;vCount = 0;dist[S] = 0;vCount++;while (1){V = FindMinDist(G, dist);if (V == ERROR)break;totalWeight += dist[V];dist[V] = 0;vCount++;for (W = G->graph[V].firstEdge; W; W = W->next){if (dist[W->adjV] != 0){if (W->weight < dist[W->adjV]){dist[W->adjV] = W->weight;}}}}if (vCount < G->Nv) /* MST中收的顶点少于|V|-1个 */totalWeight = ERROR;return totalWeight;
}

最小堆代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>#define MIN_DATA -1000
#define ELEMENT_TYPE int
#define MAX_VERTEX_NUM 1000
#define INFINITY 65535
#define ERROR -1typedef int Vertex;
typedef int WeightType;struct _MinHeap
{ELEMENT_TYPE *Elements;int Size;int Capacity;
};
typedef struct _MinHeap *MinHeap;struct _Edge
{Vertex V, W;WeightType weight;
};
typedef struct _Edge *Edge;typedef struct _AdjNode *AdjNode;
struct _AdjNode
{Vertex adjV;WeightType weight;AdjNode next;
};typedef struct AdjTable
{AdjNode firstEdge;
} AdjTable[MAX_VERTEX_NUM];struct _LGraph
{int Nv, Ne;AdjTable graph;
};
typedef struct _LGraph *LGraph;MinHeap CreateHeap(int MaxSize);
bool isEmpty(MinHeap H);
bool isFull(MinHeap H);
ELEMENT_TYPE DelMin(MinHeap H, int dist[]);
void BuildMinHeap(MinHeap H, int dist[]);
void PercUp(MinHeap H, int p, int dist[]);LGraph CreateGraph(int vertexNum);
void InsertEdge(LGraph graph, Edge E);
LGraph BuildGraph(int vertexNum, int edgeNum);void UpdateHeap(MinHeap H, int dist[], Vertex V);
Vertex FindMinDist(MinHeap H, int dist[]);
int Prim(LGraph graph, Vertex S);/*
08-图7 公路村村通
难度:2星6 15
1 2 5
1 3 3
1 4 7
1 5 4
1 6 2
2 3 4
2 4 6
2 5 2
2 6 6
3 4 6
3 5 1
3 6 1
4 5 10
4 6 8
5 6 3126 4
1 2 5
1 3 3
1 4 7
5 6 24 4
1 2 10
2 3 20
3 4 30
1 4 404 6
1 2 10
1 3 40
1 4 50
2 3 60
2 4 20
3 4 30607 21
1 2 14
1 3 11
1 4 19
1 5 12
1 6 17
1 7 20
2 3 16
2 4 15
2 5 13
2 6 10
2 7 18
3 4 20
3 5 12
3 6 11
3 7 16
4 5 14
4 6 17
4 7 19
5 6 10
5 7 15
6 7 13*/int main()
{int N, M;scanf("%d %d", &N, &M);LGraph G = BuildGraph(N, M);printf("%d\n", Prim(G, 0));free(G);return 0;
}LGraph CreateGraph(int vertexNum)
{LGraph G;G = (LGraph)malloc(sizeof(struct _LGraph));G->Nv = vertexNum;G->Ne = 0;for (int V = 0; V < G->Nv; V++){G->graph[V].firstEdge = NULL;}return G;
}void InsertEdge(LGraph G, Edge E)
{AdjNode newNode;newNode = (AdjNode)malloc(sizeof(struct _AdjNode));newNode->adjV = E->W;newNode->weight = E->weight;newNode->next = G->graph[E->V].firstEdge;G->graph[E->V].firstEdge = newNode;newNode = (AdjNode)malloc(sizeof(struct _AdjNode));newNode->adjV = E->V;newNode->weight = E->weight;newNode->next = G->graph[E->W].firstEdge;G->graph[E->W].firstEdge = newNode;
}LGraph BuildGraph(int vertexNum, int edgeNum)
{LGraph G = CreateGraph(vertexNum);G->Ne = edgeNum;Edge E;E = (Edge)malloc(sizeof(struct _Edge));for (int i = 0; i < G->Ne; i++){ // 用E->V--,E->W--解决顶点序号从1开始的问题scanf("%d %d %d", &E->V, &E->W, &E->weight);E->V--;E->W--;InsertEdge(G, E);}free(E);return G;
}Vertex FindMinDist(MinHeap H, int dist[])
{Vertex minV = ERROR;// 从堆中取出最小值,并维护最小堆的有效性。minV = DelMin(H, dist);return minV;
}int Prim(LGraph G, Vertex S)
{ // 只计算TotalWeight,无需实际创建生成树WeightType dist[G->Nv], totalWeight;Vertex V;AdjNode W;int vCount;for (V = 0; V < G->Nv; V++)dist[V] = INFINITY;for (W = G->graph[S].firstEdge; W; W = W->next)dist[W->adjV] = W->weight;totalWeight = 0;vCount = 0;dist[S] = 0;vCount++;// 根据dist对未收录顶点创建最小堆MinHeap H = CreateHeap(G->Nv);for (V = 0; V < G->Nv; V++){if (dist[V] != 0){ // H->Elements保存的是未收集顶点的编号,本例依次是1,2,3H->Elements[++H->Size] = V;}}BuildMinHeap(H, dist);while (1){V = FindMinDist(H, dist);if (V == ERROR)break;totalWeight += dist[V];dist[V] = 0;vCount++;for (W = G->graph[V].firstEdge; W; W = W->next){if (dist[W->adjV] != 0){if (W->weight < dist[W->adjV]){ /*目标是调整H->Elements,改了吗?没有,也没有必要H-Elements保存的是顶点。现在要做的是定位到W->adjV对应顶点,做percup*/dist[W->adjV] = W->weight;UpdateHeap(H, dist, W->adjV);}}}}if (vCount < G->Nv) /* MST中收的顶点少于|V|-1个 */totalWeight = ERROR;return totalWeight;
}MinHeap CreateHeap(int MaxSize)
{MinHeap H = (MinHeap)malloc(sizeof(struct _MinHeap));H->Elements = (ELEMENT_TYPE *)malloc((MaxSize + 1) * sizeof(ELEMENT_TYPE));H->Elements[0] = MIN_DATA;H->Size = 0;H->Capacity = MaxSize;return H;
}bool isEmpty(MinHeap H)
{return H->Size == 0;
}bool isFull(MinHeap H)
{return H->Size == H->Capacity;
}ELEMENT_TYPE DelMin(MinHeap H, int dist[])
{if (!isEmpty(H)){ELEMENT_TYPE min, last;int parent, child;min = H->Elements[1];last = H->Elements[H->Size--];for (parent = 1; 2 * parent <= H->Size; parent = child){child = 2 * parent;if ((child != H->Size) && (dist[H->Elements[child]] > dist[H->Elements[child + 1]])){child++;}if (dist[last] <= dist[H->Elements[child]]){break;}else{H->Elements[parent] = H->Elements[child];}}H->Elements[parent] = last;if (dist[min] < INFINITY)return min;elsereturn ERROR;}else{return ERROR;}
}void PercUp(MinHeap H, int p, int dist[])
{ /*根据顶点的dist值,决定顶点在堆中的存储位置。对dist[H->Elements[child]] > dist[H->Elements[child + 1]]的理解dist[x] > dist[y],本质是比较两个顶点之间的dist值,x,y是顶点序号。dist[x]的初始值通过dist[V] = G->dist[S][V]获得,并用dist[W] = dist[V] + G->dist[V][W]更新child是顶点在堆中的索引,H->Elements[child]存储的是顶点序号所以dist[H->Elements[child]]是顶点的dist值。*/int parent, child;ELEMENT_TYPE X;X = H->Elements[p];for (parent = p; 2 * parent <= H->Size; parent = child){child = 2 * parent;if ((child != H->Size) && (dist[H->Elements[child]] > dist[H->Elements[child + 1]])){child++;}if (dist[X] <= dist[H->Elements[child]]){break;}else{H->Elements[parent] = H->Elements[child];}}H->Elements[parent] = X;
}void BuildMinHeap(MinHeap H, int dist[])
{ // p表示顶点在堆中的位置int p;for (p = H->Size / 2; p > 0; p--){PercUp(H, p, dist);}
}void UpdateHeap(MinHeap H, int dist[], Vertex V)
{int i, idx, x;// 找到V在堆中的位置for (i = 1; i <= H->Size; i++){if (H->Elements[i] == V){idx = i;x = dist[H->Elements[idx]];break;}}// 更新V的dist值,并向上调整堆// dist[V] = dist[H->Elements[i]];/* 是否需要条件i>1?*/for (i = idx; i > 1 && dist[H->Elements[i / 2]] > x; i /= 2){H->Elements[i] = H->Elements[i / 2];}H->Elements[i] = V;
}

小结:
典型的Prim应用,姥姥没有讲最小堆的具体实现,代码磨了很久,终于过了。简言之,只有对最小生成树算法逻辑有深刻的认识,同时有足够的耐心和细心,实际动手写,才能提高代码能力。

结果:
在这里插入图片描述

相关文章:

浙大陈越何钦铭数据结构08-图7 公路村村通【循环和最小堆版】

题目 现有村落间道路的统计数据表中&#xff0c;列出了有可能建设成标准公路的若干条道路的成本&#xff0c;求使每个村落都有公路连通所需要的最低成本。 输入格式: 输入数据包括城镇数目正整数N&#xff08;≤1000&#xff09;和候选道路数目M&#xff08;≤3N&#xff09;…...

Linux 部署1Panel现代化运维管理面板远程访问

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…...

用百度云怎么重装电脑系统

用百度云怎么重装电脑系统 随着云计算技术的飞速发展&#xff0c;百度云成为了人们日常生活中不可或缺的一部分。百度云不仅提供了强大的文件存储和传输功能&#xff0c;还可以帮助人们轻松地重装电脑系统。下面就让我们来介绍一下如何用百度云重装电脑系统。 步骤一&#xf…...

SpringCloud环境搭建及入门案例

技术选型&#xff1a; Maven 3.8.4SpringBoot 2.7.8SpringCloud 2021.0.4SpringCloudAlibaba 2022.0.1.0Nacos 2.1.1Sentinel 1.8.5 模块设计&#xff1a; 父工程&#xff1a;SpringCloudAlibaba订单微服&#xff1a;order-service库存微服&#xff1a;stock-service 1.创建…...

什么是序列化和反序列化?

JSON&#xff08;JavaScript Object Notation&#xff09;和XML&#xff08;eXtensible Markup Language&#xff09;是两种常用的数据交换格式&#xff0c;用于在不同系统之间传输和存储数据。 JSON是一种轻量级的数据交换格式&#xff0c;它使用易于理解的键值对的形式表示数…...

React 消息文本循环展示

需求 页面上有个小喇叭&#xff0c;循环展示消息内容 逻辑思路 设置定时器&#xff0c;修改translateX属性来实现滚动&#xff0c;判断滚动位置&#xff0c;修改list位置来实现无限滚动 实现效果 代码 /** Author: Do not edit* Date: 2023-09-07 11:11:45* LastEditors: …...

java获取jenkins发布版本信息

一.需求&#xff1a; 系统cicd发布时首页需要展示jenkins发布的版本和优化内容 二.思路: 1.jenkins创建用户和秘钥 2.找到对应构建任务信息的api 3.RestTemplate发起http请求 三.实现&#xff1a; 1.创建用户和token 2.查找jenkins API 创建 Job POST http://localhost…...

java八股文面试[数据库]——可重复读怎么实现的(MVCC)

可重复读&#xff08;repeatable read&#xff09;定义&#xff1a; 一个事务执行过程中看到的数据&#xff0c;总是跟这个事务在启动时看到的数据是一致的。 MVCC MVCC&#xff0c;多版本并发控制, 用于实现读已提交和可重复读隔离级别。 MVCC的核心就是 Undo log多版本链 …...

cl 和 “clangtidy“分别是什么?是同一样东西吗?

作者&#xff1a;gentle_zhou 原文链接&#xff1a;cl 和 "clangtidy"分别是什么&#xff1f;是同一样东西吗&#xff1f;-云社区-华为云 先说结论&#xff1a;这两个是不同的工具&#xff0c;cl是编译器&#xff0c;clangtidy是代码检查工具&#xff0c;它们不是一…...

ubuntu22.04开机自启动Eureka服务

ubuntu22.04开机自启动Eureka服务 1、创建启动脚本eurekaService.sh #我们把启动脚本放在/usr/software目录下 cd /usr/software vim eurekaService.sheurekaService.sh内容为 #!/bin/sh # this is a eurekaService shell to startup at the mechian power on.echo "eu…...

【 OpenGauss源码学习 —— 列存储(analyze)(三)】

列存储&#xff08;analyze&#xff09; acquire_sample_rows 函数RelationGetNumberOfBlocks 函数BlockSampler_Init 函数anl_init_selection_state 函数BlockSampler_GetBlock 函数ReadBufferExtendedPageGetMaxOffsetNumber 函数HeapTupleSatisfiesVacuum 函数heapCopyTuple…...

Element Plus table formatter函数返回html内容

查看 Element Plus table formatter 支持返回 类型为string 和 VNode对象&#xff1b; 若依全局直接用h函数&#xff0c;无需引用 下面普通基本用法&#xff1a;在Element Plus中&#xff0c;你可以使用自定义的formatter函数来返回VNode对象&#xff0c;从而实现更灵活的自定…...

c++ mutable

mutable 可变的&#xff0c;易变的 跟 constant&#xff08;既C中的const&#xff09;是反义词作用&#xff1a; 保持常量对象中大部分数据成员仍然是“只读”的情况下&#xff0c;实现对个别数据成员的修改使类的const函数可以修改对象的mutable数据成员。 注意事项&#xff…...

element-plus 踩的坑

原来node版本是16.17.0,装element-plus死活装不上&#xff0c;结果要把node版本升级到18以上&#xff0c;真坑呀&#xff0c;也没人告诉我要这么干...

Python、Rust中的协程

协程 协程在不同的堆栈上同时运行&#xff0c;但每次只有一个协程运行&#xff0c;而其调用者则等待: F启动G&#xff0c;但G并不会立即运行&#xff0c;F必须显式的恢复G&#xff0c;然后 G 开始运行。在任何时候&#xff0c;G 都可能转身并让步返回到 F。这会暂停 G 并继续…...

Vuepress样式修改内容宽度

1、相关文件 一般所在目录node_modules\vuepress\theme-default\styles\wrapper.styl 2、调整宽度&#xff0c;截图中是已经调整好的&#xff0c;在我电脑上显示刚刚好。...

Vue2电商前台项目——项目的初始化及搭建

Vue2电商前台项目——项目的初始化及搭建 Vue基础知识点击此处——Vue.js 文章目录 Vue2电商前台项目——项目的初始化及搭建一、项目初始化1、脚手架目录介绍2、项目的其他配置 二、项目的路由分析及搭建1、项目的路由分析2、开发项目的步骤3、非路由组件的搭建4、路由组件的搭…...

递归算法学习——N皇后问题,单词搜索

目录 ​编辑 一&#xff0c;N皇后问题 1.题意 2.解释 3.题目接口 4.解题思路及代码 二&#xff0c;单词搜索 1.题意 2.解释 3.题目接口 4.思路及代码 一&#xff0c;N皇后问题 1.题意 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上…...

【SpringBoot】mockito+junit 单元测试

1.POM 引入以下依赖 <dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.springframework.b…...

webserver 同步 I/O 模拟 Proactor 模式的工作流程

服务器基本框架、I/O 模型、事件处理模式 一、服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理。 二、五种 I/O 模型 阻塞/非阻塞、同步/异步&#xff08;网络IO&#xff09;_呵呵哒(&#xffe3;▽&#xffe3;)&…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

HubSpot推出与ChatGPT的深度集成引发兴奋与担忧

上周三&#xff0c;HubSpot宣布已构建与ChatGPT的深度集成&#xff0c;这一消息在HubSpot用户和营销技术观察者中引发了极大的兴奋&#xff0c;但同时也存在一些关于数据安全的担忧。 许多网络声音声称&#xff0c;这对SaaS应用程序和人工智能而言是一场范式转变。 但向任何技…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...

生信服务器 | 做生信为什么推荐使用Linux服务器?

原文链接&#xff1a;生信服务器 | 做生信为什么推荐使用Linux服务器&#xff1f; 一、 做生信为什么推荐使用服务器&#xff1f; 大家好&#xff0c;我是小杜。在做生信分析的同学&#xff0c;或是将接触学习生信分析的同学&#xff0c;<font style"color:rgb(53, 1…...

项目研究:使用 LangGraph 构建智能客服代理

概述 本教程展示了如何使用 LangGraph 构建一个智能客服代理。LangGraph 是一个强大的工具&#xff0c;可用于构建复杂的语言模型工作流。该代理可以自动分类用户问题、分析情绪&#xff0c;并根据需要生成回应或升级处理。 背景动机 在当今节奏飞快的商业环境中&#xff0c…...

【电路笔记】-变压器电压调节

变压器电压调节 文章目录 变压器电压调节1、概述2、变压器电压调节3、变压器电压调节示例14、变压器电压调节示例25、变压器电压调节示例36、总结变压器电压调节是变压器输出端电压因连接负载电流的变化而从其空载值向上或向下变化的比率或百分比值。 1、概述 电压调节是衡量变…...

浅谈未来汽车电子电气架构发展趋势中的通信部分

目录 一、引入 1.1市场占比演化 1.2未来发展趋势 二、纯电动汽车与传统汽车的区别 2.1 纯电车和燃油车的架构&#xff08;干货&#xff09; 2.2 新能源汽车的分类 ⚡ 1. 纯电动汽车&#xff08;BEV&#xff09; &#x1f50b; 2. 插电式混合动力&#xff08;PHEV&#…...

MongoDB $type 操作符详解

MongoDB $type 操作符详解 引言 MongoDB 是一款流行的开源文档型数据库,它提供了丰富的查询操作符来满足不同的数据查询需求。在 MongoDB 中,$type 操作符是一个非常有用的查询操作符,它允许用户根据文档中字段的类型来查询文档。本文将详细介绍 MongoDB 的 $type 操作符,…...