实现思路
广度优先方式,是一种地毯式搜索,层层递进的方式,即从开始节点依次遍历相邻节点,层层递进
代码实现
基于之前图的数据结构,实现广度优先算法
import java.util.*; public class UndiGraph { private int point; private linkedListadjacencyList[]; public UndiGraph(int point){ this.point = point; // 初始化连接表数组 adjacencyList = new linkedList[point]; for (int i = 0; i < point; i++) { // 初始化邻接表的每一个槽位的连表 adjacencyList[i] = new linkedList<>(); } } public void addPoint(int s,int t) { // 数组的下标,代表当前顶点,连表的数据代表的临边数据 adjacencyList[s].add(t); // 因为没有方向,两个节点是互联关系,因此目标节点连线出也有源节点 adjacencyList[t].add(s); } public void bfs(int f,int t){ if (f == t){ return; } // 定义一个boolean类型的数组,用来记录顶点是否被访问过 boolean[] visited = new boolean[this.point]; // 表明起始顶点已经被访问 visited[f] = true; Queue queue = new linkedList<>(); queue.add(f); int[] prev = new int[this.point]; // 初始化线路为-1 initRouter(prev); while (!queue.isEmpty()){ // 取出队列中的顶点,获取相邻顶点进行访问 Integer p = queue.poll(); // 遍历顶点的相邻顶点 for (int i = 0; i < this.adjacencyList[p].size(); i++) { // 获取当前节点所连接的点 Integer sibiling = this.adjacencyList[p].get(i); // 判断节点是否有被访问过,未访问过,则进行访问操作 if (!visited[sibiling]){ prev[sibiling] = p; if (sibiling==t){ printRouterST(prev,f,t); return; } // 标记 visited[sibiling] = true; // 相邻顶点存入队列 queue.add(sibiling); } } } } public void initRouter(int[] router){ for (int i = 0; i < router.length; i++) { router[i] = -1; } } public void printRouterST(int[] prev,int s,int t){ if (prev[t] != -1 && s != t){ // prev记录的是当前路线,因此向前追溯,一直到开始节点依次打印 printRouterST(prev,s,prev[t]); } System.out.print(t+">>"); } public static void main(String[] args) { UndiGraph undiGraph = new UndiGraph(8); undiGraph.addPoint(0,1); undiGraph.addPoint(0,3); undiGraph.addPoint(1,2); undiGraph.addPoint(1,4); undiGraph.addPoint(2,5); undiGraph.addPoint(3,4); undiGraph.addPoint(4,5); undiGraph.addPoint(4,6); undiGraph.addPoint(5,7); undiGraph.addPoint(6,7); //undiGraph.bfs(0,7); undiGraph.bfsAllRouter(0,7); } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)