博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深度优先算法
阅读量:6512 次
发布时间:2019-06-24

本文共 4959 字,大约阅读时间需要 16 分钟。

深度优先算法所遵循的搜索策略是尽可能“深”地搜索一个图。在深度优先搜索中,对于最新发现的定点,如果它还有以此为起点而未探测到的边,就沿此边继续探测下去。当顶点v的所有边都已被探寻过后,搜索将回溯到发现顶点v的点。这一过程一直进行到发现从源顶点可达的所有顶点位置为止。

用java实现的深度优先算法代码如下:

import java.util.List;import java.util.ArrayList;/** * 栈 */public class Stack
{ private List
stack = new ArrayList
(); /** * 进栈 * * @param 进栈元素 */ public void push(E e) { stack.add(e); } /** * 出栈 * * @return 栈顶元素 */ public E pop() { if (!isEmpty()) { E result = stack.get(stack.size() - 1); stack.remove(stack.size() - 1); return result; } else { return null; } } /** * 取栈顶元素 * * @return 栈顶元素 */ public E top() { if (!isEmpty()) { return stack.get(stack.size() - 1); } else { return null; } } /** * 查询栈是否为空 * * @return */ public boolean isEmpty() { return stack.isEmpty(); }}

 

/** * 边 *  * @author Thief * */public class Edge {	public Edge(String vertexA, String vertexB) {		super();		this.vertexA = vertexA;		this.vertexB = vertexB;	}		/**	 * 顶点A	 */	private String vertexA;	/**	 * 顶点B	 */	private String vertexB;	/**	 * 该边是否已经被访问	 */	boolean isVisited = false;	public String getVertexA() {		return vertexA;	}	public void setVertexA(String vertexA) {		this.vertexA = vertexA;	}	public String getVertexB() {		return vertexB;	}	public void setVertexB(String vertexB) {		this.vertexB = vertexB;	}	public boolean isVisited() {		return isVisited;	}	public void setVisited(boolean isVisited) {		this.isVisited = isVisited;	}}

 

import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/** * 图 *  * @author Thief * */public class Graph {	/**	 * 顶点	 */	private List
vertexList = new ArrayList
(); /** * 边 */ private Map
> edgeMap = new HashMap
>(); /** * 向图中添加顶点 * * @param vertex * 顶点名字 * @throws Exception * 当顶点已经存在时抛出异常 */ public void addVertex(String vertex) throws Exception { if (vertexList.contains(vertex)) { throw new Exception("该顶点已经存在!"); } else { vertexList.add(vertex); } } /** * 向图中添加边 * * @param vertexName_A * 顶点A的名字 * @param vertexName_B * 顶点B的名字 * @throws Exception * 顶点不存在或边已经存在时抛出异常 */ public void addEdge(String vertexA, String vertexB) throws Exception { if (!vertexList.contains(vertexA) || !vertexList.contains(vertexB)) { throw new Exception("顶点不存在!"); } if (containsEdge(vertexA, vertexB)) { throw new Exception("边已经存在"); } if (edgeMap.containsKey(vertexA)) { List
list = edgeMap.get(vertexA); list.add(new Edge(vertexA, vertexB)); } else { List
list = new ArrayList
(); list.add(new Edge(vertexA, vertexB)); edgeMap.put(vertexA, list); } if (edgeMap.containsKey(vertexB)) { List
list = edgeMap.get(vertexB); list.add(new Edge(vertexB, vertexA)); } else { List
list = new ArrayList
(); list.add(new Edge(vertexB, vertexA)); edgeMap.put(vertexB, list); } } /** * 判断图中该边是否已经存在 * * @param vertexA * 顶点A * @param vertexB * 顶点B * @return 如果存在返回true,否则返回false */ private boolean containsEdge(String vertexA, String vertexB) { boolean isExist = false; if (edgeMap.containsKey(vertexA)) { List
list = edgeMap.get(vertexA); if (list.contains(new Edge(vertexA, vertexB))) { isExist = true; } } return isExist; } /** * 深度优先搜索 * * @param startVertex * 起点 */ public void DFS(String startVertex) { Stack
stack = new Stack
(); stack.push(startVertex); System.out.println("搜索开始。。。"); while (!stack.isEmpty()) { String currentVertex = stack.top(); //判断与该顶点相连的边是否都已经被访问 boolean isAllVisited = true; for (Edge edge : edgeMap.get(currentVertex)) { if (!edge.isVisited) { isAllVisited = false; break; } } if (isAllVisited) { stack.pop(); if (!stack.isEmpty()) { System.out.println(currentVertex + " --> " + stack.top()); } } else { List
listA = edgeMap.get(currentVertex); for (Edge edge : listA) { if (!edge.isVisited) { stack.push(edge.getVertexB()); System.out.println(currentVertex + " --> " + edge.getVertexB()); edge.isVisited = true; // 将边BA的访问标志置为true List
listB = edgeMap.get(edge.getVertexB()); for (Edge item : listB) { if (item.getVertexB().equals(currentVertex)) { item.isVisited = true; } } break; } } } } System.out.println("搜索结束。。。"); }}

测试代码如下:

public class Test {	public static void main(String[] args) {		Graph graph = new Graph();		try {			graph.addVertex("A");			graph.addVertex("B");			graph.addVertex("C");			graph.addVertex("D");			graph.addVertex("E");			graph.addVertex("F");			graph.addVertex("G");			graph.addEdge("A", "B");			graph.addEdge("B", "C");			graph.addEdge("B", "D");			graph.addEdge("A", "E");			graph.addEdge("E", "F");			graph.addEdge("A", "G");			graph.DFS("A");		} catch (Exception e) {			System.out.println(e.getMessage());		}	}}

执行结果如下:

搜索开始。。。

A  -->  B

B  -->  C

C  -->  B

B  -->  D

D  -->  B

B  -->  A

A  -->  E

E  -->  F

F  -->  E

E  -->  A

A  -->  G

G  -->  A

搜索结束。。。

转载于:https://www.cnblogs.com/minisculestep/p/4970075.html

你可能感兴趣的文章
FreeBinary 格式说明
查看>>
使用Spring Cloud和Docker构建微服务
查看>>
NB-IoT的成功商用不是一蹴而就
查看>>
九州云实战人员为您揭秘成功部署OpenStack几大要点
查看>>
1.电子商务支付方式有哪些 2.比较不同支付方式的优势劣势
查看>>
医疗卫生系统被爆漏洞,7亿公民信息泄露……
查看>>
神秘函件引发的4G+与全网通的较量
查看>>
CloudCC:智能CRM究竟能否成为下一个行业风口?
查看>>
追求绿色数据中心
查看>>
Web开发初学指南
查看>>
探寻光存储没落的真正原因
查看>>
高通64位ARMv8系列服务器芯片商标命名:Centriq
查看>>
中国人工智能学会通讯——融合经济学原理的个性化推荐 1.1 互联网经济系统的基本问题...
查看>>
戴尔为保护数据安全 推出新款服务器PowerEdge T30
查看>>
今年以来硅晶圆涨幅约达40%
查看>>
构建智能的新一代网络——专访Mellanox市场部副总裁 Gilad Shainer
查看>>
《数字视频和高清:算法和接口》一导读
查看>>
《中国人工智能学会通讯》——6.6 实体消歧技术研究
查看>>
如何在Windows查看端口占用情况及查杀进程
查看>>
云存储应用Upthere获7700万美元股权债务融资
查看>>