DFS入门-图的表示方法

1. 判断从V出发是否能走到终点:

bool dfs(v){
	if(V是终点) return true;
	if(V是旧点) return false;
	将V标记为旧点;
	对和V相邻的每个节点U{
		if(dfs(u) == true) return true;
	}
	return false;
}

2.判断从V出发是否能走到终点,如果能,要记录路径

Node path[MAX_LEN];
int depth;
bool dfs(V){
	if(V是终点){
		path[depth] = V;
		return true;
	}
	if(V是旧点) return false;
	将V标记为旧点;
	path[depth] = V;
	++depth;
	对和V相邻的每个节点U{
		if(dfs(U) == true) return true;
	}
	//V不应该出现在该路径上
	//退回到V的父节点
	--depth;
	return false;
}

int main(){
	将所有的点都标记为新点;
	depth = 0;
	if(dfs(起点)){
		if(int i = 0; i <= depth; i++){
			cout << path[i] << endl;
		}
	}
}

3.遍历图上的所有节点

dfs(V){
	if(V是旧点) return;
	将V标记为酒店;
	对和V相邻的每个点U{
		dfs(U);
	}
}
int main(){
	将所有的点都标记为新点;
	while(在图中能找到新点k)
		dfs(k)
}

4. 图的表示方法:邻接矩阵

用一个二维数组G存放图
G[i][j]表示节点i和节点j之间边的情况(如有无边,边方向,权值大小等)
遍历复杂度O(n2), n为节点数目

5. 图的表示方法:邻接表

在这里插入图片描述

  • 边稀疏,使用邻接表
以下是深度优先搜索(DFS)的入门级代码示例,基于常见的应用场景——遍历结构: ### DFS 遍历实现 假设有一个无向表示如下邻接表形式的数据结构 `graph`,可以使用以下 Python 实现来完成 DFS 遍历。 ```python def dfs(graph, start_node, visited=None): if visited is None: visited = set() # 创建一个集合用于记录已访问过的节点 visited.add(start_node) # 将当前节点标记为已访问 print(start_node, end=" ") # 输出当前节点 (可以根据需求修改操作) for neighbor in graph[start_node]: # 遍历当前节点的所有邻居节点 if neighbor not in visited: # 如果邻居节点未被访问过,则递归调用 dfs(graph, neighbor, visited) # 测试数据:定义一个简单的无向 graph_example = { 0: [1, 2], 1: [0, 3, 4], 2: [0, 5], 3: [1], 4: [1], 5: [2] } print("DFS Traversal starting from node 0:") dfs(graph_example, 0) # 调用函数并指定起始节点为 0 ``` 此代码实现了从给定起点出发的深度优先遍历,并打印经过的节点顺序。对于测试数据中的例子,输出应类似于[^1]: ``` DFS Traversal starting from node 0: 0 1 3 4 2 5 ``` 需要注意的是,在某些情况下可能需要调整具体逻辑以适应不同的问题场景,比如当遇到更复杂的约束条件或者特定目标时。 --- 另外一种常见情况是对树形结构执行 DFS 来解决问题,例如生成所有子集或排列组合等问题。下面提供了一个简单版本的例子用来展示如何通过递归来构建所有的子集列表[^3]: ### 使用 DFS 构建数组的所有子集 ```python def subsets(nums): result = [] def backtrack(temp_list, index): result.append(list(temp_list)) # 添加当前状态下的临时结果 for i in range(index, len(nums)): # 对于剩余部分尝试加入新的元素 temp_list.append(nums[i]) # 做选择 backtrack(temp_list, i + 1) # 进入下一层决策树 temp_list.pop() # 撤销上一步的选择 backtrack([], 0) return result nums_test = [1, 2, 3] all_subsets = subsets(nums_test) for subset in all_subsets: print(subset) ``` 该程序会依次枚举 `[1, 2, 3]` 数组里的每一个可能子集,最终得到的结果将是完整的幂集表现形式。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值