深度搜索

1、定义:

  1. 从起点出发,走过的点要做标记,发现有没走过的点,就随意挑一个往前走,走不 了就回退,此种路径搜索策略就称为“深度优先搜索”,简称“深搜”。
  2. 其实称为“远度优先搜索”更容易理解些。因为这种策略能往前走一步就往前走一 步,总是试图走得更远。所谓远近(或深度),就是以距离起点的步数来衡量的。

2.优化:

1 可行性剪枝:往后看,看是否满足约束条件
2.最优性剪枝:往前看,看当前点与曾经走过的点的最优值相比,大还是小

3、伪码

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

bool Dfs(V) { 
	if( V 为终点)
		 return true;
	if( V 为旧点) 
		return false;
	将V标记为旧点;
	 对和V相邻的每个节点U { 
	 if( Dfs(U) == true) 
	 return true;
	} 
	return false; 
}
	int main() {
		将所有点都标记为新点;
		 起点 = 1 
		 终点 = 8
		  cout << Dfs(起点);
}

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

Node path[MAX_LEN]; //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;
		}
		--depth;//!!!从该点出发已经查找了所有路,不同,则恢复原样
		return false;
}
	int main() {
	将所有点都标记为新点; 
	depth = 0; 
	if( Dfs(起点))
		 {
		 	 for(int i = 0;i <= depth; ++ i) 					cout << path[i] << endl;
	} 
}

深度优先遍历图上所有节点

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

4、图的表示方法:

邻接表:每个节点V对应一个一维数组(vector),里面存放从V连出去 的边,边的信息包括另一顶点,还可能包含边权值等。
vector<vector> NNode(10);//邻接表。NNode[i]是从点i有路 连到的城市集合
遍历复杂度:O(n+e) n为节点数目,e为边数目
邻接矩阵:用一个二维数组G存放图,G[i][ j]表示节点i和节点j之 间边的情况(如有无边,边方向,权值大小等) 。
遍历复杂度:O(n2) n为节点数目

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值