`
狂盗一枝梅
  • 浏览: 14070 次
  • 性别: 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的结果和之前的程序相比将会有很大的不同。

 

分享到:
评论

相关推荐

    数据结构中图论相关算法

    其涵盖了数据结构中图章节的大部分算法 #include #include #include #include #include #ifndef ONCE_GRAPH #define ONCE_GRAPH const int MAX_NUM=32767; const int QUEUESIZE=100; struct ArcNode {int adjvex; ...

    DFS_BFS.zip_邻接矩阵_邻接矩阵结构

    数据结构图论中,实现邻接矩阵的深度遍历和邻接矩阵广度遍历.

    数据结构基础与基础算法总结

    数据结构基础总结;树型数据结构知识总结(包括二叉搜索树,AVL树,红黑树等);图论知识总结(包括DFS,BFS等),基础算法总结(包括8种排序算法总结,常用算法思想等。)

    数据结构的钻石版 acm 模版

    3、 结构 58 3.1 并查集 58 3.2 堆 59 3.3 线段树 60 3.4 子段和 65 3.5 子阵和 65 4、 数论 66 4.1 阶乘最后非0位 66 4.2 模线性方程组 67 4.3 素数 68 4.4 欧拉函数 69 5、 数值计算 70 5.1 定积分计算(Romberg) ...

    ACM 算法经典代码 数据结构经典代码

    目录 一.数论 4 1.阶乘最后非零位 4 2. 模线性方程(组) 4 3. 素数表 6 4. 素数随机判定(miller_rabin) 6 5. 质因数分解 7 6. 最大公约数欧拉函数 8 ...数据结构: 1.顺序队列 2.顺序栈 3.链表 4.链栈 5.二叉树

    leetcode账号怎么注销-Data-Structures-Algorithms:数据结构算法

    002.玩转数据结构 概述 数据结构 数据结构研究的是数据如何在计算机中进行组织和存储,使得我们可以高效的获取数据或者修改数据 数据结构分类 线性结构 数组 栈 队列 链表 哈希表 树结构 二叉树 二分搜索树 AVL 红黑...

    AcWing算法基础课模板大全

    数据结构 —— 代码模板链接 常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS...

    BFS,DFS,以及图(Graph),树(Tree)的思考.pdf

    便于学习图论基础和数据结构初学者理解树和图的结构与遍历

    建议收藏算法基础课模板大全

    数据结构 —— 代码模板链接 常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS...

    ACM题库完整版.pdf

    数据结构(栈、队列、树、哈希表) 动态规划 贪心算法 分治算法 数学类 数论(素数判定、约数、同余) 组合数学(排列、组合、容斥原理) 线性代数(矩阵运算、行列式) 概率论(事件概率、条件概率) 其他类型 ...

    javalruleetcode-Data-Structure-and-Algorithms:数据结构与算法

    数据结构和算法,LC = LeetCode,CLRS = Cormen、Leiserson、Rivest 和 Stein,BFS/DFS = 广度/深度优先搜索,DP = 动态编程。 时间复杂度 视频编号1-16 评论:看完这 16 个视频后,我可以保证您肯定会掌握时间...

    计算机大赛-团体程序设计天梯赛算法范围.docx

    天梯赛 1.排序算法:常见的排序算法包括冒泡排序、...8.数据结构:包括树、 堆、图等数据结构,需要熟练掌握其基本原理、 结构特点、操作等方面的内容。 9.其他算法: 例如双指针算法、 滑动窗口算法、 分治算法、 背

    可拉扯的形状 可执行

    算法:BFS 数据逻辑结构:图论。 数据存储结构:邻接表(部分吸收了十字链表的思想,顶点存储有逆邻接表,为了加速寻找入度边)

    acm算法秘籍

    数据结构 并查集 树状数组 线段树 字典树 Splay ST表&划分树 树链剖分&Link;-Cut Tree 图论 强连通分量 1 双联通分量 割点和桥 拓扑排序 最短路 Dijkstra 最短路 SPFA 最短路 Floyed 次短路与第K短路 最近公共祖先...

    西电ACM选修课PPT

    本资料为西安电子科技大学 ACM/ICPC程序设计 选修课的教学PPT,包括基本数据结构,STL、BFS、DFS、动态规划、图论、计算几何、组合数学、网络流等专题讲解。

    leetcode中国-leetcode_algo:leetcode相关算法和模板使用python

    常用代码模板2——数据结构 链表与邻接表:树与图的存储 栈与队列:单调队列、单调栈 kmp Trie 并查集 堆 Hash表 C++ STL使用技巧 搜索与图论 —— 代码模板链接 常用代码模板3——搜索与图论 DFS与BFS 树与图的遍历...

    ACM算法模板和pku代码

    数据结构 闭散列法整数hash 开散列法整数hash 字符串hash 堆 二维树状数组 Trie树 二叉查找树 线段树 RMQ LCA+RMQ SB-Tree 数论 生成紧凑素数表 分解质因子 最大公约数 a^b mod n 扩张欧几里德算法 ...

    算法分类.txt

    对ACM竞赛的算法大概分了一下类,分成了数学、数据结构和算法三大块。 一 数学(Mathematics) 1 离散数学(Discrete Mathematics) 1.1 图论(Graph Theory) 图的遍历(Graph Traversal): DFS, BFS 最小生成树...

    ACM模板和一些题目的代码实现

    数据结构:组织和存储数据的方式,如数组、链表、栈、队列、树、图等。代码实现这些结构的基本操作,以支持高效的数据处理。 数论:研究整数的性质。代码可能涉及素数检测、最大公约数、模运算、同余方程等算法。 三...

Global site tag (gtag.js) - Google Analytics