深度优先搜索+模版+例题

我来更新了!

深度优先搜索

深度优先搜索(简称深搜或DFS)。

深搜的遍历过程如下:

首先找一个未被遍历过的顶点、比如a1,因为 a1 已经访问过了,所以,需要标记 a1 的状态为访问过。然后遍历 a1 旁边的邻近点,比如 a2 ,并标记a2的状态为访问过,然后访问 a2 的邻接点,例如 a3,然后记录a3已被访问过 ,然后一直往下遍历,直到访问到某个点时,根据之前做的标记发现这个点周围的邻近点均被访问过了时,就从这个点退回到上一个点,在看上一个点是否有没有被访问过的邻近点,如果上一个节点也没有没有被访问过的邻近点,就继续往上退,直到找到某一个节点的没有被访问过的邻近点。
最后需要查看是否每个节点都已经被访问过,如果还有没有被访问过的节点,那么就把这个节点标记成新的顶点并按照上面的方法继续遍历,直到全部访问完为止。这就是深度优先搜索的遍历过程。

深度优先搜索是一个不断回溯的过程

模版

void dfs(int k){//声明无返回值函数dfs并声明变量k
    if(所有的空都填完了){
        记录/判断最优解;
        return ;
    }
    for(枚举这个空能填的){
        if(合法)
        {
            记录下这个空;
            dfs(k+1);//遍历下一个点
            取消这个空(恢复/回溯);
        }
    }
}

例题

数字的和

描述

在一个数列当中,选择不同的数字相加结果可能是一个相同的值。例如数列1,2,3,4,5中选择数字1,4相加和选择数字2,3相加的结果是相同的。现设计一个程序,输入n个数字,求这n个数字之中,选择数字相加起来等于sum的方案数,与选择数字的顺序无关。

输入

输入三行

第一行输入数字n,确定数列数字的个数。

第二行输入n个数字

第三行输入一个数字sum,确定选择的数字相加的和

输出

输出选择若干数字和为sum的方案数量

输入样例 1 

5
1 2 3 4 5
9

输出样例 1

3

代码如下

#include 
using namespace std;
int n;
int hh;
int h[30];
int sum;
void dfs(int k,int a)
{
	if(k>n || a>=sum)
	{
		if(a==sum)
		{
			hh++;
		}
		return ;
	}
	dfs(k+1,a+h[k]);
	dfs(k+1,a);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>h[i];
	}
	cin>>sum;
	dfs(1,0);
	cout<

撒花✿✿ヽ(°▽°)ノ✿

你可能感兴趣的:(深度优先搜索+模版+例题)