邻接表的BFS

本文介绍了一种使用Java实现图的广度优先搜索(BFS)的方法。通过定义顶点(Vertex)类和邻接表(AdjTabGraph)类来构建图的数据结构,并实现了BFS算法来遍历图中的所有顶点。示例代码展示了如何创建图并进行BFS遍历。
部署运行你感兴趣的模型镜像


import java.util.Arrays;
import java.util.LinkedList;

class Vertex {

	public char v;// vertex
	private LinkedList<Vertex> nextList = null;// 与v相邻的vertex集合
	public int color;// 0:white 1:gray 2:black
	private int index;

	// constructor
	Vertex(char ch) {
		this.setV(ch);
		this.setColor(0);
	}

	// 添加相邻顶点
	public void addAdjVertex(Vertex adjVertex) {
		if (nextList == null) {
			nextList = new LinkedList<Vertex>();
		}
		nextList.add(adjVertex);
	}

	// 取得相邻顶点链表
	public LinkedList<Vertex> getNextList() {
		return nextList;
	}

	public int getIndex() {
		return index;
	}

	public void setIndex(int index) {
		this.index = index;
	}

	public char getV() {
		return v;
	}

	public void setV(char v) {
		this.v = v;
	}

	public int getColor() {
		return color;
	}

	public void setColor(int color) {
		this.color = color;
	}
}

class AdjTabGraph {
	private final static int MAX_VERTEX_NUM = 20;// 缺省顶点数
	private Vertex[] vertexSet;// 顶点集合
	private boolean isDirected;// 是否有向
	private int nVertexs;// 顶点实际个数
	private LinkedList<Vertex> queue;
	private int[] distance;// 源顶点与顶点u的距离为distance[u]

	// no-args constructor
	AdjTabGraph() {
		this(MAX_VERTEX_NUM, false);
	}

	// have-args constructor
	AdjTabGraph(int vertexNum, boolean flag) {
		vertexSet = new Vertex[vertexNum];
		isDirected = flag;
		nVertexs = 0;
	}

	// 添加顶点
	public void addVertex(Vertex v) {
		vertexSet[nVertexs] = v;
		vertexSet[nVertexs].setIndex(nVertexs);
		nVertexs++;
	}

	// 添加边
	public void addEdge(int startIndex, int endIndex) {
		vertexSet[startIndex].addAdjVertex(vertexSet[endIndex]);
		if (!isDirected) {
			vertexSet[endIndex].addAdjVertex(vertexSet[startIndex]);
		}
	}

	// bfs
	public void breadthFirstSearch(int index) {
		distance = new int[this.nVertexs];
		Arrays.fill(distance, Integer.MAX_VALUE);
		vertexSet[index].setColor(1);
		distance[index] = 0;
		queue = new LinkedList<Vertex>();
		queue.add(vertexSet[index]);
		while (!queue.isEmpty()) {
			Vertex u = queue.removeFirst();
			System.out.print("顶点" + u.getV() + "  ");
			for (int i = 0; i < u.getNextList().size(); i++) {
				Vertex ui = u.getNextList().get(i);
				if (ui.getColor() == 0) {
					ui.setColor(1);
					distance[ui.getIndex()] = distance[u.getIndex()] + 1;
					queue.add(ui);
				}
			}
			u.setColor(2);
		}
	}
}

public class Graph {

	public static void main(String[] args) {

		AdjTabGraph graph = new AdjTabGraph(7, false);

		graph.addVertex(new Vertex('A'));
		graph.addVertex(new Vertex('B'));
		graph.addVertex(new Vertex('C'));
		graph.addVertex(new Vertex('D'));
		graph.addVertex(new Vertex('E'));
		graph.addVertex(new Vertex('F'));
		graph.addVertex(new Vertex('G'));

		graph.addEdge(0, 1);
		graph.addEdge(0, 2);
		graph.addEdge(0, 3);
		graph.addEdge(1, 5);
		graph.addEdge(1, 4);
		graph.addEdge(2, 3);
		graph.addEdge(2, 6);
		graph.addEdge(3, 5);
		graph.addEdge(3, 6);

		graph.breadthFirstSearch(4);

	}
}

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

好的,我可以回答你的问题。邻接表是一种表示图的数据结构,其中每个节点都包含了与它相邻的节点列表。BFS(广度优先搜索)是一种图遍历算法,它从图的起点开始,按照距离递增的顺序访问各个节点。那么,如何使用邻接表进行BFS排序呢? 首先,我们需要定义一个队列,用于存储遍历到的节点。然后,从起点开始,将其加入队列中。接下来,每次从队列中取出一个节点,并访问它的相邻节点。如果某个相邻节点没有被访问过,就将其加入队列中,并标记为已访问。重复以上步骤,直到队列为空为止。 具体实现中,我们可以使用一个数组来记录每个节点是否已经被访问过。在将节点加入队列时,同时记录其距离起点的距离。这样,在访问相邻节点时,就可以更新它们距离起点的距离,并将它们加入队列中。最终,我们可以按照节点距离起点的距离排序,得到BFS排序结果。 以下是一个使用邻接表进行BFS排序的代码示例(假设图用一个包含n个节点的邻接表表示): ```python from collections import deque def bfs_sort(adj_list, start): n = len(adj_list) visited = [False] * n dist = [float('inf')] * n dist[start] = 0 q = deque([start]) visited[start] = True while q: node = q.popleft() for neighbor in adj_list[node]: if not visited[neighbor]: visited[neighbor] = True dist[neighbor] = dist[node] + 1 q.append(neighbor) sorted_nodes = sorted(range(n), key=lambda x: dist[x]) return sorted_nodes ``` 在上面的代码中,我们使用了Python内置的deque数据结构作为队列,使用lambda函数对节点进行排序。该函数按照节点距离起点的距离进行排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值