1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

时间:2019-05-12 08:59:47

相关推荐

根据邻接表求深度优先搜索和广度优先搜索_深度优先搜索/广度优先搜索与java的实现...

度:某个顶点的度就是依附于该顶点的边的个数

子图:一幅图中所有边(包含依附边的顶点)的子集

路径:是由边顺序连接的一系列定点组成

环:至少含有一条边且终点和起点相同的路径

连通图:如果图中任一个到另一个节点都存在一条路径,该图就叫连通图。

图的存储方式

1.邻接矩阵:

空间复杂度较高。

2.邻接表

图结构的java实现代码

import java.util.LinkedList;import java.util.Queue;/** * 无向图 * 数组索引代表顶点的值 */public class Graph { private int V; //顶点数量 private int E; //边数量 private Queue[] adj; //邻接表 public Graph(int vertical) { this.V = vertical; this.adj = new Queue[vertical]; for (int i = 0; i < vertical; i++) { adj[i] = new LinkedList<>(); } } public int getV() { return V; } public int getE() { return E; } /*** 向图中某一顶点加一条边* 无向图是没有方向的,需要让w出现在v的邻接表中,还需要让v出现在w的邻接表中** @param w* @param v*/ public void addEdge(int v, int w) { adj[v].add(w); adj[w].add(v); this.E++; } /*** 获取和某一顶点关联的所有顶点** @param v* @return Queue*/ public Queue adj(int v) { return adj[v]; }}

深度优先搜索:指的是如果遇到一个子节点既有兄弟节点又有子节点,那么先找子节点,再找兄弟节点

实现代码如下:

/** * 深度优先搜索 */public class DepthFirstSearch { private int sCount; //记录多少个节点与s节点相通 private boolean[] marked; //代表顶点是否被搜索过 //找出g中与顶点s所有相邻的节点 public DepthFirstSearch(Graph g, int s) { marked = new boolean[g.getV()]; //初始化跟顶点s相通的数量 this.sCount = 0; dfs(g, s); } //找出g中与顶点v所有相通的节点 private void dfs(Graph graph, int v) { //将v节点标识为已搜索 marked[v] = true; for (Integer w : graph.adj(v)) { if (!marked[w]) {dfs(graph, w); } } sCount++; } private boolean marked(int w) { //判断w顶点与s顶点是否相通 return marked[w]; } private int count() {//获取所有与s顶点相通的总数 return sCount; }}

广度优先搜索:指的是如果遇到一个子节点既有兄弟节点又有子节点,那么先找兄弟节点,再找子节点,类似于层次遍历

代码如下:

import java.util.LinkedList;import java.util.Queue;/** * 广度优先搜索 */public class BreadthFirstSearch { private int sCount; //记录多少个节点与s节点相通 private final boolean[] marked; //代表顶点是否被搜索过 private final Queue waitSearch; //存储带搜索顶点 //找出g中与顶点s所有相邻的节点 public BreadthFirstSearch(Graph g, int s) { marked = new boolean[g.getV()]; //初始化跟顶点s相通的数量 this.sCount = 0; waitSearch = new LinkedList<>(); bfs(g, s); } //找出g中与顶点v所有相通的节点 private void bfs(Graph graph, int v) { waitSearch.add(v); while (!waitSearch.isEmpty()) { Integer wait = waitSearch.poll(); for (Integer w : graph.adj(wait)) {if (!marked(w)) {marked[w] = true;sCount++;waitSearch.add(w);} } } } public boolean marked(int w) { //判断w顶点与s顶点是否相通 return marked[w]; } public int count() {//获取所有与s顶点相通的总数 return sCount; }}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。