首页 > 编程语言 >0算法基础——深度优先搜索(c++)

0算法基础——深度优先搜索(c++)

时间:2024-07-08 11:26:41浏览次数:17  
标签:优先 return int 步骤 dfs vis 算法 c++ 景点

        搜索是对一个事物的查询。他可以给出两点最短路,还能求方案数等等。

好的,正文开始:

深度优先搜索

        深度优先搜索(dfs)顾名思义就是从深度的角度出发进行搜索。具体来讲,就是完成一个步骤后将它的每一个子步骤都试一遍,注意是先搜完子步骤(一般认为子步骤层次更深)再试试当前层次的其他步骤。就比如说,有这样一个游戏:首先,你手里有一个字母a,你可以在它的后面添一个字母b或c。如果你选择添加b,那么你又可以再在它的后面添一个d或e;如果你选择添加c,那你又可以再在它的后面添一个f或g。这个小游戏的图和深度优先搜索的路径如下图所示(假设先搜左边):

编程模版: 

        好的,我们终于到编程环节了。别怕,真的很简单。

        首先,定义一个dfs函数。

void dfs(int t) {	//数据类型、函数名、参数按需填写

}

        接着,确定求出答案后的输出。

void dfs(int t) {	//数据类型、函数名、参数按需填写
	if(/*成功条件*/) {
		//输出
		return;
	}
}

         最后,依次枚举每个子步骤并定义vis数组表示访问过。

bool vis[N]; //N按需填写
void dfs(int t) {	//数据类型、函数名、参数按需填写
	if(/*成功条件*/) {
		//输出
		return;
	}
	for(/*枚举每个子步骤编号*/) {
		if(vis[/*当前枚举的子步骤编号*/]) continue;
		vis[/*同上*/]=1;
		dfs(t+1);//t+1只是个例,一般表示下一层次,真正代码要按需填写
		vis[/*同上*/]=0;//清空,以免下一个方案搜索时混淆
	}
}

实战练习:

先声明一下,不要先抄(看)答案,这对你的能力没有太大帮助。

这些都是我自创的,比较简单,适合新手练习。

1.输出n的全排列(全排列不知道的人点击左边的“全排列”)

注意了注意了,不是计算答案,而是把方案输出。

数据要求:n<=1000

(免得看到答案而设的缓冲区)

代码:

#include <iostream>
using namespace std;
bool vis[1005]; //已经访问过的数字
int ans[1005]; //用于保存答案
void dfs(int t,int n) { //这里表示答案保存了t位,全排列是有n位的
	if(t>n) {
		for(int i=1; i<=n; i++) {
			cout<<ans[i];
		}
		cout.put('\n'); //'\n'快一点。但是这仅为个人习惯,请用自己喜欢的换行方法。
		/*cout.put是putchar的c++版本*/
	}
	for(int i=1; i<=n; i++) {
		if(vis[i]) continue;
		vis[i]=1;
		ans[t]=i; //保存答案
		dfs(t+1,n); //搜索下一个层次
		ans[t]=0;
		vis[i]=0;
	}
}
int main() {
	int n;
	cin>>n;
	dfs(1,n);
	return 0;
}

运行效果:

2.图的连通性问题

请阅读背景,否则你将做不出来。

题目背景:

        小明在一个景区中的一个景点x,他想知道他能不能到达景点y。路都是单行道。

题目要求:

        首先输入x和y。

        输入两个数n和m,表示在该景区有n个景点、m条连接景点的路。(景点有编号1~n)

        接下来m行,输入两个数u和v,表示景点编号u和景点v相连。

        输出yes或no。

        0<n,m<=10000。

提示:

        可以参看我的文章《图论基础之认识、存图和遍历》。

代码:

#include <iostream>
#include <vector>
using namespace std;
bool vis[10005];
vector<int>mp[10005];
bool dfs(int x,int y,int n) {
	vis[x]=1;
	if(x==y) {
		return true;
	}
	for(auto v:mp[x]) {
		if(vis[v]) continue;
		if(dfs(v,y,n)) return true;
	}
	return false;
}
int main() {
	int x,y;
	cin>>x>>y;
	int n,m;
	cin>>n>>m;
	for(int i=1; i<=m; i++) {
		int u,v;
		cin>>u>>v;
		mp[u].push_back(v);
	}
	if(dfs(x,y,n)) {
		cout<<"yes";
	} else {
		cout<<"no";
	}
	return 0;
}

具体你们结合两篇文章分析吧。

标签:优先,return,int,步骤,dfs,vis,算法,c++,景点
From: https://blog.csdn.net/weixin_72829799/article/details/140244966

相关文章