图搜索算法详解:广度优先搜索与深度优先搜索的探索之旅

news/2024/10/16 0:21:39/

算法>图搜索算法详解:广度优先搜索与深度优先搜索的探索之旅

  • 1. 广度优先搜索(BFS)
    • 1.1 伪代码
    • 1.2 C语言实现
  • 2. 深度优先搜索(DFS)
    • 2.1 伪代码
    • 2.2 C语言实现
  • 3. 总结

算法>图搜索算法是计算机科学中用于在图结构中查找路径的算法。图由顶点(或节点)和边组成,它们可以表示各种类型的数据和它们之间的关系。算法>图搜索算法可以分为两大类:广度优先搜索(BFS)和深度优先搜索(DFS)。下面我将分别介绍这两种算法,并提供伪代码和C语言的实现示例。

在这里插入图片描述

1. 广度优先搜索(BFS)

广度优先搜索是一种遍历图的算法,它从一个节点开始,逐层遍历图中的所有节点。BFS常用于寻找最短路径。

1.1 伪代码

BFS(G, start_v):创建队列Q创建一个访问标记数组visited将start_v入队Qvisited[start_v] = truewhile Q非空:取出队列中的第一个节点vfor 每个节点v的邻居w:if w未被访问:将w入队Qvisited[w] = true

1.2 C语言实现

#include <stdio.h>
#include <stdlib.h>#define MAX_NODES 1000int visited[MAX_NODES]; // 访问标记数组
int graph[MAX_NODES][MAX_NODES]; // 邻接矩阵表示图
int numVertices; // 顶点数量void bfs(int start_v) {int Q[MAX_NODES], front = 0, rear = 0; // 用数组模拟队列visited[start_v] = 1;Q[rear++] = start_v; // 将起始顶点加入队列while (front != rear) {int v = Q[front++]; // 从队列中取出顶点printf("Visited: %d\n", v);for (int i = 0; i < numVertices; i++) {if (graph[v][i] && !visited[i]) {visited[i] = 1;Q[rear++] = i; // 将邻居加入队列}}}
}int main() {// 初始化图和顶点数量// ...// 调用BFS函数bfs(0); // 假设从顶点0开始return 0;
}

2. 深度优先搜索(DFS)

深度优先搜索是一种遍历图的算法,它从一个节点开始,尽可能深地搜索图的分支。当节点v的邻接边都已经被搜索过时,算法会回溯到前一个节点。

2.1 伪代码

DFS(G, v):如果v已经被访问过,则返回visited[v] = true访问顶点vfor 每个v的邻居w:如果w未被访问:DFS(G, w)

2.2 C语言实现

#include <stdio.h>
#include <stdlib.h>void dfs(int v) {visited[v] = 1;printf("Visited: %d\n", v);for (int i = 0; i < numVertices; i++) {if (graph[v][i] && !visited[i]) {dfs(i);}}
}int main() {// 初始化图和顶点数量// ...// 调用DFS函数dfs(0); // 假设从顶点0开始return 0;
}

3. 总结

广度优先搜索和深度优先搜索都是图搜索中的基础算法,它们在不同场景下有着广泛的应用。BFS适合寻找最短路径,而DFS适合解决连通性问题或作为其他算法的组成部分,如最小生成树或拓扑排序。

请注意,上述代码示例是简化的版本,实际应用中可能需要更复杂的数据结构和错误检查。此外,图的表示方法除了邻接矩阵外,还有邻接表等,具体实现会根据图的大小和稀疏程度进行选择。


http://www.ppmy.cn/news/1431522.html

相关文章

第25篇 Windows快捷键大全(一)

在Windows操作系统中&#xff0c;快捷键是一种非常高效的操作方式&#xff0c;可以帮助用户快速完成各种任务。 1. Ctrl C - 复制选中的项目或文本。 2. Ctrl V - 粘贴之前复制的内容到新位置。 3. Ctrl X - 剪切选中的项目或文本。 4. Ctrl Z - 撤销最近的一次操作。 5. …

【代码随想录刷题记录】LeetCode69x的平方根

题目地址 求解平方根&#xff0c;但是返回的是整数&#xff0c;则用二分法&#xff0c;如果是真的求解一个平方根的近似值&#xff0c;可以采用零点定理和牛顿迭代法&#xff0c;那种是可以求出小数值的。 1. 思路 求某数 a ( a ≥ 0 ) a(a\ge 0) a(a≥0)的平方根&#xff0c…

微电子领域常见概念(六)化学键合

微电子领域常见概念&#xff08;六&#xff09;化学键合 化学键合是化学中一个非常基础且重要的概念&#xff0c;它描述了原子之间通过电子的相互作用形成的连接。可以进行以下分类&#xff1a; 1. 离子键合&#xff08;Ionic Bonding&#xff09; • 定义&#xff1a;离子键合…

AI大模型探索之路-认知篇3:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

React-Props进阶

当涉及到 React 中的 props 进阶时&#xff0c;我们通常指的是一些高级的使用技巧和模式&#xff0c;以优化组件的性能、可读性和可维护性。下面是一些 React props 进阶的详细介绍和示例代码&#xff1a; 1. 默认属性值 (Default Prop Values) 你可以为组件的 props 指定默认…

linux-1-shell

shell脚本&#xff08;本文以Bash为基础&#xff09; 要特别注意空格&#xff01;&#xff01;&#xff01; shell一般用于数据的导入导出、文本传输、作业调度 只有单行注释 shell大多数命令可以直接在linux内运行在shell脚本中写入代码时要先写入 #!/bin/bash #! 告诉系统其…

第八周学习笔记DAY.1-异常

本课目标 了解异常概念 理解Java异常处理机制 会捕捉异常 会抛出异常 了解Java异常体系结构 什么是异常 异常是指在程序的运行过程中所发生的不正常的事件&#xff0c;它会中断正在运行的程序 生活中&#xff0c;根据不同的异常进行相应的处理&#xff0c;而不会就此中断…

机器学习|决策树|如何计算信息增益|方法总结

如是我闻 &#xff1a;那你说决策树这块还能考点啥呢&#xff0c;也就是算算属性的信息增益&#xff08;Information Gain&#xff09;了&#xff0c; 信息增益是一种评估特征&#xff08;属性&#xff09;在分类任务中重要性的方法&#xff0c;它基于熵的概念来计算。熵是一个…