5种语言实现 | 使用Dijkstra算法从起点到所有节点找到最短路径

news2025/1/9 16:11:55

编辑:东岸因为@一点人工一点智能

5种语言实现 | 使用Dijkstra算法从起点到所有节点找到最短路径C++\x5cJava\x5cPython\x5cC#\x5cJavascript,五种语言实现使用Dijkstra算法从起点到所有节点找到最短路径icon-default.png?t=N7T8https://mp.weixin.qq.com/s/6NAClr51zR_GLZGyKkr32A给定一个带权重的图和图中的一个起点,找到该点到图中所有其他节点的最短路径。

注意:给定的图中不包含任何负边。

示例:

Input: src = 0, the graph is shown below.

Output: 0 4 12 19 21 11 9 8 14
Explanation: The distance from 0 to 1 = 4.
The minimum distance from 0 to 2 = 12. 0->1->2
The minimum distance from 0 to 3 = 19. 0->1->2->3
The minimum distance from 0 to 4 = 21. 0->7->6->5->4
The minimum distance from 0 to 5 = 11. 0->7->6->5
The minimum distance from 0 to 6 = 9. 0->7->6
The minimum distance from 0 to 7 = 8. 0->7
The minimum distance from 0 to 8 = 14. 0->1->2->8

01 使用邻接矩阵的Dijkstra算法

思路是以给定起点为根节点生成一个最短路径树(SPT)。维护一个包含两个集合的邻接矩阵,

· 一个集合包含在最短路径树中的节点,

· 另一个集合包含尚未包含在最短路径树中的节点。

算法的每个步骤中,找到一个在另一个集合中(尚未包含的集合)且距离起点最小的节点。

1.1 算法

* 创建一个集合sptSet(最短路径树集合),用于跟踪包含在最短路径树中的节点,即已计算和完成的距离起点的最小距离。初始时,此集合为空。

* 为输入图中的所有节点赋予一个距离值。将所有距离值初始化为无穷大。将起点的距离值设置为0,以便首先选择它。

当sptSet未包含所有节点时

· 选择一个不在sptSet中且具有最小距离值的节点u。

· 将u包含到sptSet中。

· 然后更新u的所有邻接节点的距离值。

        - 为了更新距离值,迭代遍历所有邻接节点。

        - 对于每个邻接节点v,如果u到v的距离值(从起点开始)加上边权重小于v的距离值,则更新v的距离值。

注意:我们使用一个布尔数组sptSet[]来表示包含在SPT中的节点集合。如果值sptSet[v]为true,则表示节点v包含在SPT中,否则不包含。数组dist[]用于存储所有节点的最短距离值。

1.2 Dijkstra算法的示例

为了理解Dijkstra算法,我们来看一个图,并找到从起点到所有节点的最短路径。

考虑下面的图和起点src = 0。

步骤1:

· 集合sptSet最初为空,节点的距离值分别是{0, INF, INF, INF, INF, INF, INF, INF},其中INF表示无穷大。

· 现在选择具有最小距离值的节点。选择节点0,并将其包含在sptSet中。因此,sptSet变为{0}。将0包含在sptSet中后,更新其相邻节点的距离值。

· 节点0的相邻节点是1和7。将1和7的距离值更新为4和8。

以下子图显示了节点及其距离值,只显示具有有限距离值的节点。包含在最短路径树中的节点以绿色显示。

步骤2:

· 选择具有最小距离值且尚未包含在SPT中(不在sptSet中)的节点。选择节点1并将其添加到sptSet中。

· 因此,sptSet现在变为{0, 1}。更新节点1的相邻节点的距离值。

· 节点2的距离值变为12。

步骤3:

· 选择具有最小距离值且尚未包含在SPT中(不在sptSet中)的节点。选择节点7。因此,sptSet现在变为{0, 1, 7}。

· 更新节点7的相邻节点的距离值。节点6和8的距离值变为有限值(分别为15和9)。

步骤4:

· 选择具有最小距离值且尚未包含在SPT中(不在sptSet中)的节点。选择节点6。因此,sptSet现在变为{0, 1, 7, 6}。

· 更新节点6的相邻节点的距离值。节点5和8的距离值被更新。

图片

我们重复上述步骤,直到sptSet包含了给定图的所有节点。最后,我们得到以下最短路径树(SPT)。

图片

02 代码实现

C++语言:

// C++ Program to find Dijkstra's shortest path using
// priority_queue in STL
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f

// iPair ==> Integer Pair
typedef pair<int, int> iPair;

// This class represents a directed graph using
// adjacency list representation
class Graph {
  int V; // No. of vertices

  // In a weighted graph, we need to store vertex
  // and weight pair for every edge
  list<pair<int, int> >* adj;

public:
  Graph(int V); // Constructor

  // function to add an edge to graph
  void addEdge(int u, int v, int w);

  // prints shortest path from s
  void shortestPath(int s);
};

// Allocates memory for adjacency list
Graph::Graph(int V)
{
  this->V = V;
  adj = new list<iPair>[V];
}

void Graph::addEdge(int u, int v, int w)
{
  adj[u].push_back(make_pair(v, w));
  adj[v].push_back(make_pair(u, w));
}

// Prints shortest paths from src to all other vertices
void Graph::shortestPath(int src)
{
  // Create a priority queue to store vertices that
  // are being preprocessed. This is weird syntax in C++.
  // Refer below link for details of this syntax
  // https://www.geeksforgeeks.org/implement-min-heap-using-stl/
  priority_queue<iPair, vector<iPair>, greater<iPair> >
    pq;

  // Create a vector for distances and initialize all
  // distances as infinite (INF)
  vector<int> dist(V, INF);

  // Insert source itself in priority queue and initialize
  // its distance as 0.
  pq.push(make_pair(0, src));
  dist[src] = 0;

  /* Looping till priority queue becomes empty (or all
  distances are not finalized) */
  while (!pq.empty()) {
    // The first vertex in pair is the minimum distance
    // vertex, extract it from priority queue.
    // vertex label is stored in second of pair (it
    // has to be done this way to keep the vertices
    // sorted distance (distance must be first item
    // in pair)
    int u = pq.top().second;
    pq.pop();

    // 'i' is used to get all adjacent vertices of a
    // vertex
    list<pair<int, int> >::iterator i;
    for (i = adj[u].begin(); i != adj[u].end(); ++i) {
      // Get vertex label and weight of current
      // adjacent of u.
      int v = (*i).first;
      int weight = (*i).second;

      // If there is shorted path to v through u.
      if (dist[v] > dist[u] + weight) {
        // Updating distance of v
        dist[v] = dist[u] + weight;
        pq.push(make_pair(dist[v], v));
      }
    }
  }

  // Print shortest distances stored in dist[]
  printf("Vertex Distance from Source\n");
  for (int i = 0; i < V; ++i)
    printf("%d \t\t %d\n", i, dist[i]);
}

// Driver's code
int main()
{
  // create the graph given in above figure
  int V = 9;
  Graph g(V);

  // making above shown graph
  g.addEdge(0, 1, 4);
  g.addEdge(0, 7, 8);
  g.addEdge(1, 2, 8);
  g.addEdge(1, 7, 11);
  g.addEdge(2, 3, 7);
  g.addEdge(2, 8, 2);
  g.addEdge(2, 5, 4);
  g.addEdge(3, 4, 9);
  g.addEdge(3, 5, 14);
  g.addEdge(4, 5, 10);
  g.addEdge(5, 6, 2);
  g.addEdge(6, 7, 1);
  g.addEdge(6, 8, 6);
  g.addEdge(7, 8, 7);

  // Function call
  g.shortestPath(0);

  return 0;
}

Java语言:

import java.util.*;

class Graph {
  private int V;
  private List<List<iPair>> adj;

  Graph(int V) {
    this.V = V;
    adj = new ArrayList<>();
    for (int i = 0; i < V; i++) {
      adj.add(new ArrayList<>());
    }
  }

  void addEdge(int u, int v, int w) {
    adj.get(u).add(new iPair(v, w));
    adj.get(v).add(new iPair(u, w));
  }

  void shortestPath(int src) {
    PriorityQueue<iPair> pq = new PriorityQueue<>(V, Comparator.comparingInt(o -> o.first));
    int[] dist = new int[V];
    Arrays.fill(dist, Integer.MAX_VALUE);

    pq.add(new iPair(0, src));
    dist[src] = 0;

    while (!pq.isEmpty()) {
      int u = pq.poll().second;

      for (iPair v : adj.get(u)) {
        if (dist[v.first] > dist[u] + v.second) {
          dist[v.first] = dist[u] + v.second;
          pq.add(new iPair(dist[v.first], v.first));
        }
      }
    }

    System.out.println("Vertex Distance from Source");
    for (int i = 0; i < V; i++) {
      System.out.println(i + "\t\t" + dist[i]);
    }
  }

  static class iPair {
    int first, second;

    iPair(int first, int second) {
      this.first = first;
      this.second = second;
    }
  }
}

public class Main {
  public static void main(String[] args) {
    int V = 9;
    Graph g = new Graph(V);

    g.addEdge(0, 1, 4);
    g.addEdge(0, 7, 8);
    g.addEdge(1, 2, 8);
    g.addEdge(1, 7, 11);
    g.addEdge(2, 3, 7);
    g.addEdge(2, 8, 2);
    g.addEdge(2, 5, 4);
    g.addEdge(3, 4, 9);
    g.addEdge(3, 5, 14);
    g.addEdge(4, 5, 10);
    g.addEdge(5, 6, 2);
    g.addEdge(6, 7, 1);
    g.addEdge(6, 8, 6);
    g.addEdge(7, 8, 7);

    g.shortestPath(0);
  }
}

Python 3 语言:

import heapq

# iPair ==> Integer Pair
iPair = tuple

# This class represents a directed graph using
# adjacency list representation
class Graph:
  def __init__(self, V: int): # Constructor
    self.V = V
    self.adj = [[] for _ in range(V)]

  def addEdge(self, u: int, v: int, w: int):
    self.adj[u].append((v, w))
    self.adj[v].append((u, w))

  # Prints shortest paths from src to all other vertices
  def shortestPath(self, src: int):
    # Create a priority queue to store vertices that
    # are being preprocessed
    pq = []
    heapq.heappush(pq, (0, src))

    # Create a vector for distances and initialize all
    # distances as infinite (INF)
    dist = [float('inf')] * self.V
    dist[src] = 0

    while pq:
      # The first vertex in pair is the minimum distance
      # vertex, extract it from priority queue.
      # vertex label is stored in second of pair
      d, u = heapq.heappop(pq)

      # 'i' is used to get all adjacent vertices of a
      # vertex
      for v, weight in self.adj[u]:
        # If there is shorted path to v through u.
        if dist[v] > dist[u] + weight:
          # Updating distance of v
          dist[v] = dist[u] + weight
          heapq.heappush(pq, (dist[v], v))

    # Print shortest distances stored in dist[]
    for i in range(self.V):
      print(f"{i} \t\t {dist[i]}")

# Driver's code
if __name__ == "__main__":
  # create the graph given in above figure
  V = 9
  g = Graph(V)

  # making above shown graph
  g.addEdge(0, 1, 4)
  g.addEdge(0, 7, 8)
  g.addEdge(1, 2, 8)
  g.addEdge(1, 7, 11)
  g.addEdge(2, 3, 7)
  g.addEdge(2, 8, 2)
  g.addEdge(2, 5, 4)
  g.addEdge(3, 4, 9)
  g.addEdge(3, 5, 14)
  g.addEdge(4, 5, 10)
  g.addEdge(5, 6, 2)
  g.addEdge(6, 7, 1)
  g.addEdge(6, 8, 6)
  g.addEdge(7, 8, 7)

  g.shortestPath(0)

C#语言:

using System;
using System.Collections.Generic;

// This class represents a directed graph using
// adjacency list representation
public class Graph
{
private const int INF = 2147483647;

private int V;
private List<int[]>[] adj;

public Graph(int V)
{ 
  // No. of vertices
  this.V = V;
  // In a weighted graph, we need to store vertex
  // and weight pair for every edge
  this.adj = new List<int[]>[V];

  for (int i = 0; i < V; i++)
  {
  this.adj[i] = new List<int[]>();
  }
}

public void AddEdge(int u, int v, int w)
{
  this.adj[u].Add(new int[] { v, w });
  this.adj[v].Add(new int[] { u, w });
}

// Prints shortest paths from src to all other vertices
public void ShortestPath(int src)
{
  // Create a priority queue to store vertices that
  // are being preprocessed.
  SortedSet<int[]> pq = new SortedSet<int[]>(new DistanceComparer());

  // Create an array for distances and initialize all
  // distances as infinite (INF)
  int[] dist = new int[V];
  for (int i = 0; i < V; i++)
  {
  dist[i] = INF;
  }

  // Insert source itself in priority queue and initialize
  // its distance as 0.
  pq.Add(new int[] { 0, src });
  dist[src] = 0;

  /* Looping till priority queue becomes empty (or all
    distances are not finalized) */
  while (pq.Count > 0)
  {
  // The first vertex in pair is the minimum distance
  // vertex, extract it from priority queue.
  // vertex label is stored in second of pair (it
  // has to be done this way to keep the vertices
  // sorted by distance)
  int[] minDistVertex = pq.Min;
  pq.Remove(minDistVertex);
  int u = minDistVertex[1];

  // 'i' is used to get all adjacent vertices of a
  // vertex
  foreach (int[] adjVertex in this.adj[u])
  {
    // Get vertex label and weight of current
    // adjacent of u.
    int v = adjVertex[0];
    int weight = adjVertex[1];

    // If there is a shorter path to v through u.
    if (dist[v] > dist[u] + weight)
    {
    // Updating distance of v
    dist[v] = dist[u] + weight;
    pq.Add(new int[] { dist[v], v });
    }
  }
  }

  // Print shortest distances stored in dist[]
  Console.WriteLine("Vertex Distance from Source");
  for (int i = 0; i < V; ++i)
  Console.WriteLine(i + "\t" + dist[i]);
}

private class DistanceComparer : IComparer<int[]>
{
  public int Compare(int[] x, int[] y)
{
  if (x[0] == y[0])
  {
    return x[1] - y[1];
  }
  return x[0] - y[0];
  }
}
}

public class Program
{ 
// Driver Code
public static void Main()
{
  // create the graph given in above figure
  int V = 9;
  Graph g = new Graph(V);

  // making above shown graph
  g.AddEdge(0, 1, 4);
  g.AddEdge(0, 7, 8);
  g.AddEdge(1, 2, 8);
  g.AddEdge(1, 7, 11);
  g.AddEdge(2, 3, 7);
  g.AddEdge(2, 8, 2);
  g.AddEdge(2, 5, 4);
  g.AddEdge(3, 4, 9);
  g.AddEdge(3, 5, 14);
  g.AddEdge(4, 5, 10);
  g.AddEdge(5, 6, 2);
  g.AddEdge(6, 7, 1);
  g.AddEdge(6, 8, 6);
  g.AddEdge(7, 8, 7);
  g.ShortestPath(0);
}
}

// this code is contributed by bhardwajji

Javascript:

<script> 
// javascript Program to find Dijkstra's shortest path using
// priority_queue in STL
const INF = 2147483647;

// This class represents a directed graph using
// adjacency list representation
class Graph {

  constructor(V){

    // No. of vertices
    this.V = V;

    // In a weighted graph, we need to store vertex
    // and weight pair for every edge
    this.adj = new Array(V);
    for(let i = 0; i < V; i++){
      this.adj[i] = new Array();
    }
  }

  addEdge(u, v, w)
  {
    this.adj[u].push([v, w]);
    this.adj[v].push([u, w]);
  }

  // Prints shortest paths from src to all other vertices
  shortestPath(src)
  {
    // Create a priority queue to store vertices that
    // are being preprocessed. This is weird syntax in C++.
    // Refer below link for details of this syntax
    // https://www.geeksforgeeks.org/implement-min-heap-using-stl/
    let pq = [];

    // Create a vector for distances and initialize all
    // distances as infinite (INF)
    let dist = new Array(V).fill(INF);

    // Insert source itself in priority queue and initialize
    // its distance as 0.
    pq.push([0, src]);
    dist[src] = 0;

    /* Looping till priority queue becomes empty (or all
    distances are not finalized) */
    while (pq.length > 0) {
      // The first vertex in pair is the minimum distance
      // vertex, extract it from priority queue.
      // vertex label is stored in second of pair (it
      // has to be done this way to keep the vertices
      // sorted distance (distance must be first item
      // in pair)
      let u = pq[0][1];
      pq.shift();

      // 'i' is used to get all adjacent vertices of a
      // vertex
      for(let i = 0; i < this.adj[u].length; i++){

        // Get vertex label and weight of current
        // adjacent of u.
        let v = this.adj[u][i][0];
        let weight = this.adj[u][i][1];

        // If there is shorted path to v through u.
        if (dist[v] > dist[u] + weight) {
          // Updating distance of v
          dist[v] = dist[u] + weight;
          pq.push([dist[v], v]);
          pq.sort((a, b) =>{
            if(a[0] == b[0]) return a[1] - b[1];
            return a[0] - b[0];
          });
        }
      }
    }

    // Print shortest distances stored in dist[]
    document.write("Vertex Distance from Source");
    for (let i = 0; i < V; ++i)
      document.write(i, "   ", dist[i]);
  }
}

// Driver's code
// create the graph given in above figure
let V = 9;
let g = new Graph(V);

// making above shown graph
g.addEdge(0, 1, 4);
g.addEdge(0, 7, 8);
g.addEdge(1, 2, 8);
g.addEdge(1, 7, 11);
g.addEdge(2, 3, 7);
g.addEdge(2, 8, 2);
g.addEdge(2, 5, 4);
g.addEdge(3, 4, 9);
g.addEdge(3, 5, 14);
g.addEdge(4, 5, 10);
g.addEdge(5, 6, 2);
g.addEdge(6, 7, 1);
g.addEdge(6, 8, 6);
g.addEdge(7, 8, 7);

// Function call
g.shortestPath(0);

// The code is contributed by Nidhi goel. 
</script>

输出:

时间复杂度:O(V^2)

辅助空间:O(V)

注意:

· 该代码计算了最短距离,但没有计算路径信息。可以创建一个父节点数组,在更新距离时更新父节点数组,并使用它来显示从源到不同节点的最短路径。

· 该实现的时间复杂度是O(V^2)。如果使用邻接表表示输入图,可以借助二叉堆将其减少为O(E * log V)。更多详情,请参阅邻接表表示的Dijkstra算法。

· Dijkstra算法对具有负权重环的图不起作用。

03 Dijkstra算法的应用

谷歌地图使用Dijkstra算法显示起点和目标点之间的最短距离。

在计算机网络中,Dijkstra算法是各种路由协议的基础,例如OSPF(开放最短路径优先)和IS-IS(中间系统到中间系统)。

交通和交通管理系统使用Dijkstra算法来优化交通流量,减少拥堵,并计划车辆的最高效路径。

航空公司使用Dijkstra算法来规划最小化燃料消耗、减少旅行时间的飞行路径。

Dijkstra算法在电子设计自动化中用于在集成电路和大规模集成(VLSI)芯片上进行路由连接。

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

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

相关文章

RTT学习

中断管理 什么是中断&#xff1f;简单的解释就是系统正在处理某一个正常事件&#xff0c;忽然被另一个需要马上处理的紧急事件打断&#xff0c;系统转而处理这个紧急事件&#xff0c;待处理完毕&#xff0c;再恢复运行刚才被打断的事件。生活中&#xff0c;我们经常会遇到这样…

本地部署运行大模型ollama

本地部署运行大模型ollama ollama模型下载地址 在我使用 vscode 开发时&#xff0c;使用 coplit 或 chatgpt 来辅助过于昂贵&#xff0c;于是我希望找到一个可以调用本地大模型的工具来辅助编程。 ollama 就是这样一个工具。 ollama使用 ollama 是一个可以将训练好的模型部署到…

前端开发攻略---在页面上渲染大量元素,使用defer减少白屏等待时间,优化页面响应速度

1、优化前 2、优化后 3、优化思路 1、在元素数量不变的情况下&#xff0c;进行一步一步的渲染&#xff0c;先渲染一些重要的元素或者需要用户第一时间看到的元素。 2、使用Hooks封装优化函数 4、优化代码 拥有大量元素的组件&#xff08;Item&#xff09;&#xff1a;文件位置&…

嵌入式系统中的嵌入式主板,你了解多少?

嵌入式主板&#xff0c;也称为嵌入式计算机主板&#xff0c;是一种专门设计用于嵌入式系统的计算机主板。与台式机和笔记本电脑中使用的常规主板不同&#xff0c;嵌入式主板设计用于集成到更大的电子设备中&#xff0c;例如汽车、医疗设备或自动售货机。在本文中&#xff0c;我…

C++ ─── 类和对象(构造函数和析构函数)

目录 1.类的6个默认成员函数 2. 构造函数&#xff08;对类进行 “初使化”&#xff09; 2.1 概念 2.2 特性 3.析构函数&#xff08;对类进行 “销毁”&#xff09; 3.1 概念 3.2 特性 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真…

stable diffusion基本原理

diffusion model latent diffusion &#xff1a;先对图片降维&#xff0c;然后在降维空间做diffusion&#xff1b;stable diffusion即基于此方法实现的&#xff0c;因此计算量很小&#xff1b; 共用降噪网络U-Net&#xff1a;输入noisy imagestep&#xff0c;告诉网络当前的噪声…

Redis入门到通关之Redis缓存数据实战

文章目录 ☃️什么是缓存?❄️❄️为什么要使用缓存❄️❄️如何使用缓存 ☃️缓存实战❄️❄️缓存模型和思路❄️❄️演示代码 ☃️缓存更新策略❄️❄️数据库缓存不一致解决方案 ☃️什么是缓存? 缓存就像自行车,越野车的避震器 举个栗子: 越野车,山地自行车,都拥有&qu…

5个常见的前端手写功能:New、call apply bind、防抖和节流、instanceof、ajax

实现New 首先创建一个新的空对象设置原型&#xff0c;将对象的原型设置为函数的prototype对象让函数的this指向这个对象&#xff0c;执行构造函数的代码判断函数的返回值类型&#xff0c;如果是值类型&#xff0c;返回创建的对象。如果是引用类型&#xff0c;就返回这个引用类…

四维轻云|如何使用场景在线协作功能?

众所周知&#xff0c;四维轻云是一款轻量化的地理空间数据管理云平台&#xff0c;支持地理空间数据的在线管理、编辑以及分享。平台有项目管理、数据上传、场景搭建、发布分享、素材库等功能模块。现在&#xff0c;就为大家介绍一下如何使用场景协作编辑功能。 1、协作模式开启…

【Redis 神秘大陆】004 高可用集群

四、Redis 高可用和集群 当你发现这些内容对你有帮助时&#xff0c;为了支持我的工作&#xff0c;不妨给一个免费的⭐Star&#xff0c;这将是对我最大的鼓励&#xff01;感谢你的陪伴与支持&#xff01;一起在技术的路上共同成长吧&#xff01;点击链接&#xff1a;GitHub | G…

最新!!又5本On Hold无情被踢!!还剩11本期刊调查ing

【SciencePub学术】众所周知&#xff0c;期刊如果被打上“On Hold”的标签&#xff0c;就说明该期刊正在被进行调查评估&#xff0c;后面如果调查出期刊存在问题的话&#xff0c;则会被WOS期刊目录剔除&#xff01; 4.15号&#xff0c;科睿唯安官方更新了4月的SCI/SSCI期刊目录…

API数据应用场景电商运营选品API接口接入key获取演示

在电商运营中&#xff0c;API&#xff08;应用程序接口&#xff09;数据可以用于各种场景&#xff0c;特别是在选品过程中。以下是一些API数据应用场景&#xff0c;以帮助电商运营进行更有效的选品&#xff1a; 市场趋势分析&#xff1a;通过调用第三方数据提供商的API&#xf…

2023 中国 SDS 年度报告发布:XSKY 蝉联对象存储软件第一,整体 TOP5

近日&#xff0c;IDC 发布了《IDC China SDS Market Overview&#xff0c; 2023》市场报告&#xff0c;XSKY 星辰天合继续蝉联对象存储软件第一&#xff0c;文件存储保持领先地位&#xff0c;并且在中国市场整体 SDS 排名第五&#xff0c;也是 TOP5 里面唯一的专业 SDS 厂商。 …

力扣算法-回溯

递归 104.二叉树的最大深度 回溯 17.电话号码的字母组合 ①子集型回溯 78.子集 (1)选不选 (2)选哪个 131.分割回文串 &#xff08;1593.拆分字符串使唯一子字符串的数目最大 也可以用这个思路解&#xff1a;从结果角度&#xff0c;分割字符串&#xff09; ②组合型回溯…

Windows版MySQL5.7解压直用(免安装-绿色-项目打包直接使用)

windows下mysql分类 MySQL分为 安装版和解压版 安装版: 安装方便&#xff0c;下一步------下一步就OK了&#xff0c;但重装系统更换环境又要重新来一遍&#xff0c;会特别麻烦解压版&#xff08;推荐&#xff09;&#xff1a; 这种方式&#xff08;项目打包特别方便&#xf…

EDMI电表光通讯口数采案例

【上海数采物联网科技有限公司】 工商业光伏发电并网项目 EDMI协议电表数采案例 项目背景及需求 项目地点&#xff1a;重庆港西光伏电站&#xff08;中广核重庆&#xff09; 项目背景&#xff1a;光伏发电并网项目电能监控 项目目的及难点&#xff1a;实现对EDMI协议电表…

毕设(五)——画pico扩展板

文章目录 一、扩展板原理图二、PCB三、3d预览 一、扩展板原理图 用pico作为主控&#xff0c;调用三个传感器&#xff0c;加上一个NB模块 排针间距差不多都是2.54&#xff08;只要能插在洞洞板或者面包板&#xff09;使用网络标签&#xff0c;对端口进行命名&#xff0c;相同…

终于看到一个不在 Backbone上研究 ReNet的了!直接优化小目标检测性能,不卷ImageNet-1K数据集!

终于看到一个不在 Backbone上研究 ResNet的了&#xff01;直接优化小目标检测性能&#xff0c;不卷ImageNet-1K数据集&#xff01; 前言 传统的基于深度学习的目标检测网络在数据预处理阶段常通过调整图像大小以达到特征图中的统一尺寸和尺度。调整大小的目的是为了便于模型传播…

1W 3KVDC 隔离 单输出 DC/DC 电源模块——TPB-1W 系列

TPB-1W系列产品是专门针对PCB上分布式电源系统中需要与输入电源隔离且输出精度要求较高的电源应用场合而设计。该产品适用于&#xff1b;1&#xff09;输入电源的电压变化≤5%&#xff1b;2&#xff09;输入输出之前要求隔离电压≥3000VDC&#xff1b;3&#xff09;对输出电压稳…

CESS 受邀出席香港Web3.0标准化协会第一次理事会议,共商行业未来

2024 年 4 月 5 日&#xff0c;CESS&#xff08;Cumulus Encrypted Storage System&#xff09;作为香港 Web3.0 标准化协会的副理事会成员&#xff0c;于香港出席了 2024 年度第一次理事会会议。此次会议汇聚了来自不同领域的知名企业和专家&#xff08;参会代表名单见文末&am…