BFS(Breadth First Search),中文名为宽度优先搜索,是横向遍历图的一种算法;这种算法必须借助队列才能够实现。
需求:输入edgeCount,startNode,edgeCount代表图有多少条边,startNode代表遍历的起点,接下来输入edgeCount组数据,每组有两个数node1与node2,代表一条边;最后输出BFS算法得到的序列,数和数之间使用空格隔开。
一、实现代码
import java.util.Scanner; import java.util.Queue; import java.util.LinkedList; class Node { int value; Node next = null; } public class BFS { private static boolean[] visited = new boolean[1024]; private static Node[] nodes = new Node[1024]; public static void main(String args[]) { init(); Scanner scanner = new Scanner(System.in); int edgeCount = scanner.nextInt(); int startNode = scanner.nextInt(); for (int i = 0; i < edgeCount; i++) { int nodeValue1 = scanner.nextInt(); int nodeValue2 = scanner.nextInt(); Node node1 = new Node(); node1.value = nodeValue2; node1.next = nodes[nodeValue1].next; nodes[nodeValue1].next = node1; Node node2 = new Node(); node2.value = nodeValue1; node2.next = nodes[nodeValue2].next; nodes[nodeValue2].next = node2; } visited[startNode] = true; bfs(visited, nodes, startNode, edgeCount); } private static void init() { for (int i = 0; i < visited.length; i++) { visited[i] = false; } for (int i = 0; i < nodes.length; i++) { nodes[i] = new Node(); } } public static void bfs(boolean[] visited, Node[] nodes, int startNode, int edgeCount) { Queue<Integer> queue = new LinkedList<Integer>(); queue.offer(startNode); System.out.print(startNode + " "); while (!queue.isEmpty()) { int top = queue.poll(); Node node = nodes[top].next; while (node != null) { if (visited[node.value] == false) { System.out.print(node.value + " "); visited[node.value] = true; queue.offer(node.value); } node = node.next; } } } } /* * 7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5 */
二、测试数据
输入:
7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5
输出:
0 4 3 2 1 5
7 0 0 3 0 4 1 4 1 5 2 3 2 4 3 5
输出:
0 4 3 2 1 5
三、ACM
题目链接:数据结构实验之图论二:基于邻接表的广度优先搜索遍历
AC代码(Java版):
import java.util.Scanner; import java.util.Queue; import java.util.LinkedList; class Node { int value; Node next = null; } public class Main { private static boolean[] visited = new boolean[1024]; private static Node[] nodes = new Node[1024]; public static void main(String args[]) { Scanner scanner = new Scanner(System.in); int sum = scanner.nextInt(); while ((sum--) != 0) { init(); int k = scanner.nextInt(); int edgeCount = scanner.nextInt(); int startNode = scanner.nextInt(); for (int i = 0; i < edgeCount; i++) { int nodeValue1 = scanner.nextInt(); int nodeValue2 = scanner.nextInt(); Node node1 = new Node(); node1.value = nodeValue2; node1.next = nodes[nodeValue1].next; nodes[nodeValue1].next = node1; Node node2 = new Node(); node2.value = nodeValue1; node2.next = nodes[nodeValue2].next; nodes[nodeValue2].next = node2; } visited[startNode] = true; bfs(visited, nodes, startNode, edgeCount); } } private static void init() { for (int i = 0; i < visited.length; i++) { visited[i] = false; } for (int i = 0; i < nodes.length; i++) { nodes[i] = new Node(); } } public static void bfs(boolean[] visited, Node[] nodes, int startNode, int edgeCount) { Queue<Integer> queue = new LinkedList<Integer>(); queue.offer(startNode); System.out.print(startNode + " "); while (!queue.isEmpty()) { int top = queue.poll(); Node node = nodes[top].next; sort(node); while (node != null) { if (visited[node.value] == false) { System.out.print(node.value + " "); visited[node.value] = true; queue.offer(node.value); } node = node.next; } } System.out.println(); } /** * 对邻接表进行排序 * * @param node */ private static void sort(Node node) { boolean flag = false; Node p; Node q; while (flag = !flag) { p = node; q = p.next; while (q != null) { if (p.value > q.value) { int temp = p.value; p.value = q.value; q.value = temp; flag = false; } else { p = p.next; q = p.next; } } } } }
需要注意的是在该题目中需要输入定点的个数,虽然没有什么用,但是作为题目的要求,还是需要写上的;另外,邻接表需要"排序",上面的sort方法是添加的方法,是一种变型的“冒泡排序”算法,实际上如果进行了排序,BFS的结果和之前的程序相比将会有很大的不同。
相关推荐
数据结构中的图论和树是两个非常重要的概念,它们在计算机科学中有着广泛的应用,尤其是在算法设计和数据存储方面。图论关注的是节点之间通过边连接的网络结构,而树是一种特殊的图,它具有单一的根节点和分层的结构...
《图论与数据结构》是计算机科学中一门重要的理论课程,涵盖了离散数学中的核心概念,如图的基本概念、图的遍历算法、树与树形结构、图的搜索算法、最短路径问题以及数据结构如栈、队列、链表、数组、哈希表等。...
数据结构是计算机科学中至关重要的基础,而图论作为数据结构的一个分支,研究的是网络状数据的组织方式。拓扑排序则是图论中一个实用且基础的概念,它主要用于有向无环图(DAG,Directed Acyclic Graph)的排序问题...
数据结构图论是计算机科学中研究图的数据结构和算法的领域。图是由顶点和边组成的数学结构,广泛应用于计算机科学、信息科学、物理科学等领域。 图的定义:图G由两个集合V(Vertex)和E(Edge)组成,记为G=(V,E),其中...
这份“数据结构大全”涵盖了从基本的线性数据结构到复杂的数据结构,再到图论和排序算法,是大学生深入学习数据结构的理想资源。 1. **线性数据结构**:线性数据结构包括数组、链表、栈和队列等。数组是最基础的...
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的检索、存储和操作。本资料主要针对数据结构期末考试进行复习,涵盖了数据结构的基本概念、主要类型以及相关的算法...
本资源包"ljg_resource1"提供了全面的数据结构知识,从基础的线性数据结构到复杂的树形结构,再到图论以及排序算法的实现。 1. **线性数据结构**:线性结构是最基本的数据结构,包括数组、链表、栈和队列。数组是一...
6. **图(Graph)**:图是由顶点(节点)和连接这些顶点的边组成的复杂数据结构,用于模拟网络、图论中的关系等。图可以是有向的或无向的,并且可以包含权重。图的遍历算法有深度优先遍历(DFS)和广度优先遍历(BFS...
算法部分,主要包括排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、搜索算法(如深度优先搜索DFS、广度优先搜索BFS、A*搜索等)、图论算法(如最短路径算法Dijkstra、Floyd-Warshall、...
数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中高效地组织和管理数据,以便进行快速查找、插入和删除等操作。朱战力教授的《数据结构》习题解答是一个宝贵的资源,帮助学生深入理解和掌握这门学科的...
数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和组织数据,以便于高效地进行各种操作。王道考研的408数据结构课件是专为准备计算机专业考研的学生设计的,提供了全面的复习材料,旨在帮助考生节省笔记...
此外,图论问题和动态规划也是数据结构考试中的常见考点。图论涉及最小生成树(如Prim算法和Kruskal算法)、最短路径(Dijkstra算法、Floyd-Warshall算法)等;动态规划则是一类优化问题的解决方案,如背包问题、...
图论在数据结构中扮演着重要角色,如深度优先搜索(DFS)和广度优先搜索(BFS)用于遍历图,迪杰斯特拉算法和弗洛伊德算法用于求解单源最短路径,普里姆和克鲁斯卡尔算法用于构建最小生成树。 十、堆与优先队列 堆...
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中有效地存储和组织数据,以便进行高效的检索、插入和删除操作。《清华大学教程 -- 数据结构》是一部权威且深入的教材,特别适合初学者和进阶者学习。这篇...
数据结构是计算机科学与技术专业的一门核心课程,它研究如何在计算机中组织和存储数据,以便高效地访问和处理。对于准备参加青岛大学910数据结构考研的学生来说,了解并掌握这部分知识至关重要。本资源包含2015年至...
3. 图论:图是一种非线性数据结构,由节点(顶点)和边(连接节点)构成。图可以表示各种复杂的实体关系,如网络、交通路线等。 - **图的表示**:通常用邻接矩阵或邻接表来表示图。 - **图的遍历**:深度优先搜索...
清华大学的这份数据结构PPT很可能包含了以上所有内容,并且可能还涵盖了图论、散列表、字符串匹配、文件系统等高级话题。此外,它可能还会介绍一些实用的数据结构设计技巧,如动态规划、贪心算法、回溯法等,这些都...
10. **图论**:图论是数学的一个分支,与数据结构紧密相关,涉及最小生成树(如Prim算法和Kruskal算法)、拓扑排序、网络流等问题。 在准备安徽工业大学861数据结构考研时,考生需要熟练掌握上述知识点,并能够灵活...
在“西北工业大学数据结构noj_1-6题”中,我们可以推测这是一系列与数据结构相关的编程练习题目,旨在帮助学生理解和应用各种数据结构。以下是基于这些题目可能涵盖的一些关键知识点的详细解释: 1. **线性数据结构...
图的遍历算法如深度优先搜索(DFS)和广度优先搜索(BFS)是数据结构中的重要概念。 散列结构如散列表,通过哈希函数实现快速的查找、插入和删除操作,其性能通常取决于哈希函数的质量和冲突解决策略。 在考研真题...