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

我来更新了!

深度优先搜索

深度优先搜索(简称深搜或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 <bits/stdc++.h>
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<<hh;
    return 0;
}

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
深度优先搜索(DFS)是一种常用的图遍历算法,用于遍历或搜索图中的节点。下面是一个使用C++模板实现的深度优先搜索算法: ```cpp #include <iostream> #include <vector> #include <stack> using namespace std; // 图的节点结构 struct Node { int value; vector<Node*> neighbors; bool visited; }; // 深度优先搜索函数 void dfs(Node* start) { stack<Node*> s; s.push(start); while (!s.empty()) { Node* current = s.top(); s.pop(); if (!current->visited) { cout << current->value << " "; current->visited = true; for (Node* neighbor : current->neighbors) { if (!neighbor->visited) { s.push(neighbor); } } } } } int main() { // 创建图的节点 Node* node1 = new Node{1, {}, false}; Node* node2 = new Node{2, {}, false}; Node* node3 = new Node{3, {}, false}; Node* node4 = new Node{4, {}, false}; // 构建图的连接关系 node1->neighbors.push_back(node2); node1->neighbors.push_back(node3); node2->neighbors.push_back(node4); node3->neighbors.push_back(node4); // 从节点1开始进行深度优先搜索 dfs(node1); return 0; } ``` 上述代码中,我们首先定义了一个`Node`结构来表示图的节点,其中包含了节点的值、邻居节点的指针以及一个标记是否已访问的布尔值。然后,我们使用一个栈来辅助进行深度优先搜索,将起始节点压入栈中,并在循环中不断弹出栈顶节点进行处理。如果当前节点未被访问过,则输出其值,并将其标记为已访问。接着,将当前节点的未访问过的邻居节点压入栈中,以便后续继续遍历。直到栈为空时,搜索结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值