首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

(整数列表数组)图的SML BFS遍历

图的SML BFS遍历是指使用广度优先搜索算法(Breadth-First Search, BFS)来遍历一个图的整数列表数组。

图是由顶点(vertex)和边(edge)组成的数据结构,可以用来表示各种实际问题的关系。整数列表数组是一种常见的图的表示方式,其中整数表示顶点,列表数组表示边的连接关系。

BFS是一种图遍历算法,它从图的某个顶点开始,依次访问与该顶点直接相邻的顶点,然后再依次访问与这些相邻顶点直接相邻的顶点,以此类推,直到图中所有顶点都被访问到为止。BFS使用队列数据结构来辅助实现。

BFS遍历的过程中,每个顶点都有三种状态:未被发现(undiscovered)、已被发现但未被探索(discovered)、已被发现且已被探索(explored)。初始状态下,所有顶点都是未被发现的。BFS遍历会按照顶点的发现顺序,逐层地遍历图,即先访问距离起始顶点最近的顶点,然后逐渐向外扩展到距离起始顶点更远的顶点。

BFS遍历图的优势在于能够按层次进行遍历,从而可以用于寻找最短路径、生成最小生成树等应用场景。

对于SML(Standard ML)编程语言来说,可以使用以下伪代码来实现图的BFS遍历:

代码语言:txt
复制
fun bfs(graph: int list array, start: int) =
    let
        val n = length graph
        val queue = Queue.empty
        val visited = Array.tabulate(n, fn _ => false)
    in
        Queue.enqueue(start, queue);
        visited[start] := true;
        
        while not (Queue.isEmpty queue) do
            let
                val v = Queue.dequeue queue
            in
                (* 处理顶点v *)
                print (Int.toString v ^ " ");
                
                List.app (fn w =>
                    if not (Array.sub(visited, w)) then
                        (Array.update(visited, w, true);
                         Queue.enqueue(w, queue))
                    else ()
                ) (Array.sub(graph, v));
            end;
    end;

在这段伪代码中,graph参数表示整数列表数组,start参数表示起始顶点。通过创建一个队列queue和一个布尔型数组visited来辅助遍历过程。从起始顶点开始,将其加入队列并标记为已访问,然后进入循环,不断取出队列中的顶点并处理。对于每个取出的顶点v,首先将其打印出来,然后遍历与v相邻的顶点,若某个相邻顶点w未被访问过,则将其加入队列,并标记为已访问。

在腾讯云的产品中,可以使用腾讯云的云服务器CVM来搭建运行SML代码的环境。云服务器CVM是一种可扩展、高性能、安全可靠的云计算基础设施服务,可以满足各类计算需求。您可以在腾讯云官网查找更多关于云服务器CVM的信息和产品介绍。

参考链接:

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

图的遍历(BFS)

DFS深度优先遍历 广度优先遍历的过程可以类比树的层序遍历 广度优先遍历的伪代码 BFS 邻接矩阵 //BFS-----广度优先遍历 void Graph::BFS() { queue数组存放用户输入的一维数组的顶点数据,n表示顶点个数,e是边的个数 Graph(DataType v[], int n, int e); //BFS----广度优先遍历 void BFS...arcNum; i++) { cin >> vi >> vj;//输入边依附的两个顶点编号 //这是无向图的边初始化标志 arc[vi][vj] = 1;//有边的标志 arc[vj...][vi] = 1; } } //BFS-----广度优先遍历 void Graph::BFS() { queue q;//队列存储的是顶点信息 //外层for循环,检查是否每个节点都被访问过...[MAX];//访问数组 public: Graph(DataType v[], int n, int e); void BFS(); }; //构造函数实现:用户传入的顶点结构体数组,里面存放着顶点数据

64520

图的遍历(BFS+DFS)

图的遍历与树的遍历基本类似,但要注意两个不同: 1. 图中可能有环路,因此可能会导致死循环; 2. 一个图可能由多个独立的子图构成,因此一条路径走到头后要重新选择尚未遍历的起点。...图的邻接表数据结构请参见:图的邻接表示法Java版 宽度优先遍历 思路 选择一个尚未访问的起点,依次访问它的相邻结点; 若相邻结点还有相邻结点的话,再依次访问尚未访问的相邻结点;直到以该结点为起点的这条路径上所有的结点都已访问...; 再选择一个尚未访问的结点作为起点,重复上述操作,直到所有结点都已访问为止; 代码实现 /** * 图的宽度优先遍历 * PS:本函数用于选择未访问的起点 * @param graph 图的邻接表...( graph, start ); } } } /** * 图的宽度优先遍历 * PS:本函数用于访问指定起点的路径上所有结点 * @param graph 图的邻接表...代码实现 /** * 图的深度优先遍历 * PS:本函数用于选择未访问的起点 * @param graph 图的邻接表 */ public void DFS( Map<String,List<ENode

1.1K110
  • 【小算法】图的遍历之广度优先(BFS)

    谈到算法,图的操作是避免不了。 而我们一般谈到图时,又必定会谈到图的遍历。 图的遍历通常有 2 种,深度优先(DFS) 和广度优先(BFS)。...深度优先可以阅读我这篇博文:【小算法】图的遍历之深度优先(DFS) 本篇博文讲解广度优先(BFS)。 图的表示 图有两种表示方式 ? 1. 临接矩阵 ?...用一个数组储存所有的顶点的信息,每个顶点又用一个链表或者是数组存放与它相临的结点的信息。 这样的表示方式特别适合稀疏图,也就是比较少的结点之间相互有连接。...上面是一张图,如果要遍历图中所有的结点,又不重复。 在实际编码中,如果要用 BFS 的方式去遍历一个图的话,通常我们会用一个队列来动态保存陆续访问的结点。 我们首先选择 A. 所以 A 先入队列。...巧妙地利用队列先进先出(FIFO)的特性用来保存遍历的结点痕迹,最终实现了无重复也无遗漏的图的遍历,这种算法思想非常的赞。

    1.2K30

    【经验分享】数据结构——总结,图的深度优先遍历(DFS)和广度优先遍历(BFS)与二叉树遍历的比较

    图是一种常见的数据格式,它的遍历主要分为两种: 深度优先遍历(DFS):类似于二叉树的前序前序遍历 广度优先遍历(BFS):类似于二叉树的层次遍历 深度优先遍历(DFS) 定义 深度优先遍历(...DFS,Depth-First Search)是一种图遍历算法,它沿着图的深度方向进行搜索。...广度优先遍历(BFS) 定义 广度优先遍历(BFS,Breadth-First Search)是一种图遍历算法,它沿着图的广度方向进行搜索。...这个过程与 BFS 非常相似,因为 BFS 按层访问图的所有节点。 类比解释: 在 BFS 中,节点被访问的顺序类似于层次遍历中的顺序,BFS 逐层访问节点,每一层对应树的某一层。...广度优先遍历(BFS) 与 层次遍历 类似,因为它们都按层次访问图中的节点,逐层展开,直到遍历完整个图。

    45010

    二叉树的最大深度,图

    文章公众号首发,关注 程序员哆啦A梦 第一时间获取最新的文章 ❤️笔芯❤️~ 栈,队列,链表,集合,字典和散列表,树 图 图是网络结构的抽象模型。...(有向图) 如果图中每两个顶点间在双向上都存在路径,则该图是强连通的 图还可以是未加权的或是加权的 邻接矩阵 每个节点都和一个整数相关联,该整数将作为数组的索引。...s += '\n'; //{13} } return s; }; 图的遍历 广度优先搜索(Breadth-First Search,BFS) 深度优先搜索(Depth-First Search...广度优先搜索算法会从指定的第一个顶点开始遍历图,先访问其所有的相邻点,就像一次访 问图的一层(就是先宽后深地访问顶点) 示例: // 执行此初始化操作 var initializeColor...,或者在对每层进行迭代之前保存当前队列元素的个数 树的基本操作- 遍历 - 层次遍历(BFS) 标签:DFS 找出终止条件:当前节点为空 找出返回值:节点为空时说明高度为 0,所以返回 0;节点不为空时则分别求左右子树的高度的最大值

    62520

    数据结构与算法——BFS(广度优先搜索)

    算法介绍: 广度优先搜索(Breadth-First Search,简称BFS)是一种遍历或搜索树和图的算法,也称为宽度优先搜索,BFS算法从图的某个节点开始,依次对其所有相邻节点进行探索和遍历,然后再对这些相邻节点的相邻节点进行探索...由此我们可以看出来,BFS这种无脑走必定会导致时间复杂度非常高,如果终点离起点非常远,那么几乎每个点都要遍历一下,这样的话BFS这种算法就不适合了,BFS适合于点少的图,求最短距离之类的。...算法模板: 首先我们需要一个队列来辅助BFS实现,还需要一个初始化的输入数组,还有一个标记数组。...,现在各种各样的题目层出不穷,bfs考察的还是主要分为图的遍历问题、最短路问题、连通块搜索等,下面博主选取几个比较具有代表性的给大家讲解一下,加深理解一下bfs算法。...还是跟之前的BFS步骤一样,就是在目标状态那里多了一个更新最小步数。这道题比前面的图的遍历问题难一点点,注意,BFS是不需要回溯的,否则会陷入死循环。

    30410

    从 0 开始学习 JavaScript 数据结构与算法(十二)图

    边的表示略微复杂 因为边是两个顶点之间的关系,所以表示起来会稍微麻烦一些。 下面是变常见的表示方式。 邻接矩阵 概述 邻接矩阵让每个节点和一个整数向关联, 该整数作为数组的下标值....如果是一个无向图,邻接矩阵展示出来的二维数组,其实是一个对称图。 邻接矩阵还有一个比较严重的问题就是如果图是一个稀疏图 邻接表 概述 邻接表由图中每个顶点以及和顶点相邻的顶点列表组成。...这个列表有很多中方式来存储:数组/链表/字典(哈希表)都可以。 演示 ?...有两种算法可以对图进行遍历 广度优先搜索(Breadth-First Search, 简称 BFS) 深度优先搜索(Depth-First Search, 简称 DFS) 两种遍历算法,都需要明确指定第一个被访问的顶点...遍历的注意点 完全探索一个顶点要求我们便查看该顶点的每一条边。 对于每一条所连接的没有被访问过的顶点,将其标注为被发现的,并将其加进待访问顶点列表中。 为了保证算法的效率:每个顶点至多访问两次。

    69420

    Python算法揭秘:图的表示与遍历,解锁数据之美

    无向图中的边是无方向的,表示节点之间的双向关系。 图可以使用邻接矩阵或邻接表来表示。邻接矩阵是一个二维数组,其中的元素表示节点之间是否存在边。...邻接表是一个由链表或数组构成的列表,其中的每个元素表示一个节点及其相邻节点的列表。...深度优先遍历和广度优先遍历的原理和实现步骤 深度优先遍历(Depth-First Search,DFS)和广度优先遍历(Breadth-First Search,BFS)是图的两种常见遍历方式。...广度优先遍历(BFS):从起始节点开始,先遍历与起始节点直接相邻的节点,然后逐层遍历其他节点。BFS使用队列来实现遍历过程。...然后,分别实现了深度优先遍历函数dfs和广度优先遍历函数bfs。 总结 这就是第十四天的教学内容,关于图的表示与遍历的基本概念、原理和实现步骤。

    33320

    人工智能基础-路径规划

    图的遍历 深度优先遍历 DFS 遍历一个节点,需要访问它自己,再遍历左子树和右子树,根据遍历顺序分为以下三种遍历 前序遍历:先访问当前节点,再遍历左右子树 中序遍历:先遍历左子树,再访问自己,最后遍历右子树...后序遍历: D-E-B-F-C-A广度优先遍历 BFS 广度优先遍历是指先遍历顶点V的所有子节点V1,V2……Vn,然后再分别遍历V1,V2……Vn的子节点。...Dijikstra算法 设图G的邻接矩阵M,M(i.j)表示i到j的距离,用一个大整数来表示i和j不连通 用二维数组map来表示矩阵M,称map[0][0]为原点 #define G 10000 int...G可以使用一个大整数来表示,也可以使用-1来表示,但是这样就需要额外写一个判断语句 用d[i]数组来表示原点到i点的最短路程,并使用map[0]来初始化。...7 选择D作为下一个循环的节点,由于A,C节点都被遍历过,只需要考虑F,但是从D到F的优先级为9,而从C到F的优先级为7,因此不更新列表 父节点 NULL S S A C C C 节点 S A

    66010

    学会这14种模式,你可以轻松回答任何编码面试问题

    如何确定何时使用此模式: 如果要求你在不占用额外内存的情况下反向链接列表 链表模式就地反转的问题: 撤消子列表(中) 反转每个K元素子列表(中) 7、Tree BFS 该模式基于广度优先搜索(BFS)技术来遍历树...使用这种方法可以有效地解决涉及逐级遍历树的任何问题。 Tree BFS模式的工作原理是将根节点推送到队列,然后不断迭代直到队列为空。对于每次迭代,我们都删除队列开头的节点,然后"访问"该节点。...如何识别Tree BFS模式: 如果要求你逐级遍历一棵树(或逐级遍历) 具有Tree BFS模式的问题: 二叉树级顺序遍历(简单) 锯齿形遍历(中) 8、Tree DFS 树DFS基于深度优先搜索(DFS...然后,重复此过程以对所有元素进行排序遍历。 该模式如下所示: 将每个数组的第一个元素插入最小堆中。 之后,从堆中取出最小的(顶部)元素并将其添加到合并列表中。...该模式如下所示: 初始化 a)使用HashMap将图存储在邻接列表中 b)要查找所有源,请使用HashMap保持度数 构建图并找到所有顶点的度数 a)从输入中构建图并填充度数HashMap。

    2.9K41

    文心一言 VS 讯飞星火 VS chatgpt (303)-- 算法导论22.2 1题

    然后,我们遍历队列中的每个节点,对于每个未访问过的邻居节点,我们更新其距离和父节点信息,并将其加入队列。 在main函数中,我们初始化了图的节点和边,并调用了BFS函数。...BFS(g,3) } 在这个例子中,Graph 结构体表示有向图,包含顶点列表和边列表。...BFS 函数实现了广度优先搜索算法,并计算了每个顶点的d值(到达该顶点的距离)和π值(到达该顶点的前驱结点)。 请根据你的图22-2(a)修改顶点列表和边列表,然后运行这个程序。...kimi: 广度优先搜索(Breadth-First Search, BFS)是一种遍历或搜索树或图的算法,它从一个节点开始,逐层遍历节点。...在有向图中,BFS可以用于找到从源节点到其他所有可达节点的最短路径。 在BFS中,我们通常会维护两个数组:d和π。d数组存储从源节点到每个节点的距离(即边的数量),而π数组存储每个节点的前驱节点。

    9420

    js版本的(广、深)度优先搜索0. 前言1.队列、栈2.BFS1.1 矩阵形式的图的遍历1.2 树的BFS举例3.DFS

    常用的操作是,尾部加入元素(push),尾部取出元素(pop) 2.BFS BFS是靠一个队列来辅助运行的。顾名思义,广度搜索,就是对于一个树形结构,我们一层层节点去寻找目标节点。 ?...矩阵形式的图的遍历 假设有几个点,我们需要设计一个算法,判定两个点有没有相通 假设点12345是这样的结构: ?...n 输入一个整数n,表明我们需要得到s字符长度,0<n<10000 案例: in: 6 out: 3 思路:利用广度优先搜索,假设左节点是操作1,右节点是操作2,这样子就形成了操作树。...V8老生代的垃圾回收机制中的标记-清除也利用了DFS。我们定义三种颜色:黑白灰,白色是未处理过的,灰是已经经过了但没有处理,黑色是已经处理过了 还是前面那幅图 ?...我们用两个数组,一个是栈,一个是保存我们遍历顺序的,数组的元素拿到的都是原对象树的引用,是会改变原对象的节点颜色的 从根节点开始,把根节点1压入栈,染成灰色 【1:灰】 发现1的白色子节点2,压入栈染色

    51820

    环检测算法及拓扑排序(修订版)

    前文 图论基础 写了 DFS 算法遍历图的框架,无非就是从多叉树遍历框架扩展出来的,加了个 visited 数组罢了: // 防止重复遍历同一个节点 boolean[] visited; // 从节点...注意 visited 数组和 onPath 数组的区别,因为二叉树算是特殊的图,所以用遍历二叉树的过程来理解下这两个数组的区别: 上述 GIF 描述了递归遍历二叉树的过程,在 visited 中被标记为...遍历完左右子树之后才会执行后序遍历位置的代码。换句话说,当左右子树的节点都被装到结果列表里面了,根节点才会被装进去。...其实 BFS 算法借助 indegree 数组记录每个节点的「入度」,也可以实现这两个算法。不熟悉 BFS 算法的读者可阅读前文 BFS 算法核心框架。...List[] buildGraph(int n, int[][] edges) { // 见前文 } 按道理,图的遍历 都需要 visited 数组防止走回头路,这里的 BFS

    1.3K20

    【刷题】Leetcode 1609.奇偶树

    下面初步解释一下两种算法: 广度优先搜索(BFS) 广度优先搜索是连通图的一种遍历算法,是很多重要图算法的原型(比如Dijkstra最短路径算法和Prim最小生成树算法)。...基本过程是从根节点开始,沿着树(图)遍历所有节点,访问完所以节点后算法终止。常使用队列(FIFO)辅助实现BFS算法。...深度优先算法(DFS) 深度优先算法是图论的经典算法,是针对图和树的遍历算法(比如前序遍历,中序遍历,后序遍历)。...如果是死路就返回,返回图中遇见未探索的分支就进行进行处理,直到达到要求。一般使用堆或栈来辅助实现DFS算法。 思路一(BFS) 根据上面的介绍我们可以通过队列来辅助我们进行遍历所有树。...偶数下标 层上的所有节点的值都是 奇 整数,从左到右按顺序 严格递增 奇数下标 层上的所有节点的值都是 偶 整数,从左到右按顺序 严格递减 判断递增递减是通过 当前节点值与dp[ p ]的值进行比较

    11210
    领券