`
狂盗一枝梅
  • 浏览: 18038 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

【数据结构】【图论】BFS

阅读更多

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

三、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)的排序问题...

    数据结构-图论-PPT

    数据结构图论是计算机科学中研究图的数据结构和算法的领域。图是由顶点和边组成的数学结构,广泛应用于计算机科学、信息科学、物理科学等领域。 图的定义:图G由两个集合V(Vertex)和E(Edge)组成,记为G=(V,E),其中...

    数据结构大全,从最基础的线性数据结构到树形数据结构,再到图论,排序算法,都有完整的实现。

    这份“数据结构大全”涵盖了从基本的线性数据结构到复杂的数据结构,再到图论和排序算法,是大学生深入学习数据结构的理想资源。 1. **线性数据结构**:线性数据结构包括数组、链表、栈和队列等。数组是最基础的...

    数据结构 考试 试卷 数据结构期末复习

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便于进行快速的检索、存储和操作。本资料主要针对数据结构期末考试进行复习,涵盖了数据结构的基本概念、主要类型以及相关的算法...

    数据结构大全,从最基础的线性数据结构到树形数据结构,再到图论,排序算法,都有完整的实现!

    本资源包"ljg_resource1"提供了全面的数据结构知识,从基础的线性数据结构到复杂的树形结构,再到图论以及排序算法的实现。 1. **线性数据结构**:线性结构是最基本的数据结构,包括数组、链表、栈和队列。数组是一...

    数据结构课后答案.pdf

    6. **图(Graph)**:图是由顶点(节点)和连接这些顶点的边组成的复杂数据结构,用于模拟网络、图论中的关系等。图可以是有向的或无向的,并且可以包含权重。图的遍历算法有深度优先遍历(DFS)和广度优先遍历(BFS...

    数据结构与算法 数据结构与算法课后习题答案

    算法部分,主要包括排序算法(如冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序等)、搜索算法(如深度优先搜索DFS、广度优先搜索BFS、A*搜索等)、图论算法(如最短路径算法Dijkstra、Floyd-Warshall、...

    数据结构 朱战力 习题解答 数据结构 朱战力 习题解答

    数据结构是计算机科学中的核心课程之一,主要研究如何在计算机中高效地组织和管理数据,以便进行快速查找、插入和删除等操作。朱战力教授的《数据结构》习题解答是一个宝贵的资源,帮助学生深入理解和掌握这门学科的...

    21王道考研408数据结构全部课件源代码.zip

    数据结构是计算机科学中的核心课程,它探讨了如何有效地存储和组织数据,以便于高效地进行各种操作。王道考研的408数据结构课件是专为准备计算机专业考研的学生设计的,提供了全面的复习材料,旨在帮助考生节省笔记...

    2017-2021年重庆邮电大学802数据结构考研真题

    此外,图论问题和动态规划也是数据结构考试中的常见考点。图论涉及最小生成树(如Prim算法和Kruskal算法)、最短路径(Dijkstra算法、Floyd-Warshall算法)等;动态规划则是一类优化问题的解决方案,如背包问题、...

    数据结构教程-第5版-李春葆-配套课件PPT

    图论在数据结构中扮演着重要角色,如深度优先搜索(DFS)和广度优先搜索(BFS)用于遍历图,迪杰斯特拉算法和弗洛伊德算法用于求解单源最短路径,普里姆和克鲁斯卡尔算法用于构建最小生成树。 十、堆与优先队列 堆...

    清华大学教程 --数据结构

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中有效地存储和组织数据,以便进行高效的检索、插入和删除操作。《清华大学教程 -- 数据结构》是一部权威且深入的教材,特别适合初学者和进阶者学习。这篇...

    2015-2017年青岛大学910数据结构考研真题

    数据结构是计算机科学与技术专业的一门核心课程,它研究如何在计算机中组织和存储数据,以便高效地访问和处理。对于准备参加青岛大学910数据结构考研的学生来说,了解并掌握这部分知识至关重要。本资源包含2015年至...

    数据结构大全,从最基础的线性数据结构到树形数据结构,再到图论,排序算法,都有完整的实现。目前比较完整的是java的代.zip

    3. 图论:图是一种非线性数据结构,由节点(顶点)和边(连接节点)构成。图可以表示各种复杂的实体关系,如网络、交通路线等。 - **图的表示**:通常用邻接矩阵或邻接表来表示图。 - **图的遍历**:深度优先搜索...

    数据结构ppt清华大学版

    清华大学的这份数据结构PPT很可能包含了以上所有内容,并且可能还涵盖了图论、散列表、字符串匹配、文件系统等高级话题。此外,它可能还会介绍一些实用的数据结构设计技巧,如动态规划、贪心算法、回溯法等,这些都...

    2008、2014-2016年安徽工业大学861数据结构考研真题

    10. **图论**:图论是数学的一个分支,与数据结构紧密相关,涉及最小生成树(如Prim算法和Kruskal算法)、拓扑排序、网络流等问题。 在准备安徽工业大学861数据结构考研时,考生需要熟练掌握上述知识点,并能够灵活...

    西北工业大学数据结构noj_1-6题

    在“西北工业大学数据结构noj_1-6题”中,我们可以推测这是一系列与数据结构相关的编程练习题目,旨在帮助学生理解和应用各种数据结构。以下是基于这些题目可能涵盖的一些关键知识点的详细解释: 1. **线性数据结构...

    2021年重庆邮电大学802数据结构考研真题

    图的遍历算法如深度优先搜索(DFS)和广度优先搜索(BFS)是数据结构中的重要概念。 散列结构如散列表,通过哈希函数实现快速的查找、插入和删除操作,其性能通常取决于哈希函数的质量和冲突解决策略。 在考研真题...

Global site tag (gtag.js) - Google Analytics