图的DFS

 每个节点访问一次,每条边访问一次,时间复杂度O(V+E)


public class DFS {
	public static int timer = 0;
	
	public static void dfs(Graph g, Vertex v){
		assert(true);
		if(v.color != Vertex.WHITE){
			return;
		}
		System.out.print(v.id + " ");
		v.color = Vertex.GRAY;
		v.start_time = timer++;
		for(int i=0; i<g.count_vertex; i++){
			if(g.adjMatrix[v.id][i] > 0){
				g.vertexs[i].parent = v;
				dfs(g, g.vertexs[i]);
			}
		}
		v.color = Vertex.BLACK;
		v.end_time = timer++;
	}
	

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		//如果是无向连通图,一次遍历可以读完,只有一棵树
		Graph g = Graph.createNoDirectedGraph(8, "dfs.txt");
		g.printGraph();

		DFS.timer = 0;
		DFS.dfs(g, g.vertexs[5]);
		System.out.println();
		for(int i=0; i<g.count_vertex; i++){
			System.out.print(g.vertexs[i].start_time + " " + g.vertexs[i].end_time + " : ");
		}
		System.out.println();
		for(int i=0; i<g.count_vertex; i++){
			System.out.print(g.vertexs[i].parent.id + " ");
		}
		System.out.println();
		//如果有向连通图,一次读不完,多次读,形成森林
//		Graph g = Graph.createDirectedGraph(8, "dfs.txt");
//		g.printGraph();

		
//		for(int i=0; i<g.count_vertex; i++){
//			if(g.vertexs[i].color == Vertex.WHITE){
//				DFS.dfs(g, g.vertexs[i]);
//			}
//		}
		
	}

}



### 有向的深度优先搜索算法实现与解释 #### 1. 深度优先搜索 (DFS) 的基本概念 深度优先搜索(Depth First Search, DFS)是一种用于遍历或搜索树或的算法。它沿着树的深度遍历节点,尽可能深入地探索每一个分支[^2]。 对于有向而言,DFS 可以帮助发现中的连通分量、环路以及拓扑排序等问题。其核心思想是从某个顶点出发,访问与其相邻的所有未被访问过的顶点,并递归地对这些邻接点执行相同的操作。 --- #### 2. Python 实现有向DFS 算法 下面是一个基于邻接表表示的有向DFS 实现: ```python class Graph: def __init__(self, vertices): self.V = vertices # 节点数量 self.graph = [[] for _ in range(vertices)] # 邻接表 def add_edge(self, u, v): """ 添加到有向 """ self.graph[u].append(v) def dfs_util(self, node, visited, result): """ 辅助函数:递归实现DFS """ visited[node] = True # 标记当前节点已访问 result.append(node) # 将当前节点加入结果列表 # 对于当前节点的所有邻居节点递归调用dfs_util for neighbor in self.graph[node]: if not visited[neighbor]: self.dfs_util(neighbor, visited, result) def depth_first_search(self, start_node): """ 主函数:从指定起点开始进行DFS """ visited = [False] * self.V # 初始化所有节点为未访问状态 result = [] # 存储DFS顺序的结果 # 如果起始节点有效,则启动DFS过程 if 0 <= start_node < self.V: self.dfs_util(start_node, visited, result) # 返回DFS遍历结果 return result # 测试代码 if __name__ == "__main__": g = Graph(6) # 创建一个具有6个节点的有向 g.add_edge(0, 1) g.add_edge(0, 2) g.add_edge(1, 3) g.add_edge(2, 4) g.add_edge(3, 5) print("DFS Traversal from vertex 0:", g.depth_first_search(0)) ``` 此代码定义了一个 `Graph` 类来存储有向的信息并实现了 DFS 方法。通过递归的方式依次访问每个节点及其子节点,直到无法继续为止[^1]。 --- #### 3. 关键点解析 - **初始化阶段** 使用布尔数组 `visited[]` 来记录哪些节点已经被访问过,防止重复访问造成死循环。 - **递归逻辑** 当前节点标记为已访问后,对其所有的邻接点逐一尝试访问。如果某邻接点尚未被访问,则对该点再次调用相同的递归方法。 - **时间复杂度** 假设有 \( V \) 个节点和 \( E \) 条,在最坏情况下,每条都会被检查一次,因此总的时间复杂度为 \( O(V + E) \)[^2]。 - **空间复杂度** 主要由栈的空间消耗决定,取决于的最大深度。在极端情况下可能达到 \( O(V) \)。 --- #### 4. 应用场景举例 - **网络爬虫** 在抓取网页链接的过程中,可以通过 DFS 按照一定路径逐步扩展页面范围[^3]。 - **迷宫求解** 利用 DFS 探索所有可行路线直至找到出口位置。 - **检测环路** 结合颜色标记机制判断是否存在回溯路径从而确认是否有环存在。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值