深度优先搜索

深度优先搜索

Depth First Search,简称 DFS:一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点 v 的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点 v 的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为 O (n!)。

基本框架

void dfs(int step) {
if (到达目的地) { //目标状态
输出解;
} else {
for (int i=1; i<=子状态数; i++) {//产生式
if (满足条件) {//扩展条件
保存结果;
dfs(step+1); //下一步
回溯;
}
}
}
}
void dfs(int step) {
for (int i=1; i<=子状态数; i++) {
if (满足条件) {
保存结果;
if (到达目的地) 输出解;
else dfs(step+1); //下一步
回溯;
}
}
}

发明者

深度优先搜索是由 Jonh E. Hopcroft 和 Robert E. Tarjan 发明的。在 1971~1972 年,在加利福尼亚大学研究图的连通性和平面性时发明的。他们因此获得了 1986 年的图灵奖。

例题(一维)

1317:【例 5.2】组合的输出

【题目描述】

排列与组合是常用的数学方法,其中组合就是从 n 个元素中抽出 r 个元素 (不分顺序且 r≤n),我们可以简单地将 n 个元素理解为自然数 1,2,…,n,从中任取 r 个数。

现要求你用递归的方法输出所有组合。

例如 n=5,r=3,所有组合为:

1 2 3   1 2 4   1 2 5   1 3 4   1 3 5   1 4 5   2 3 4   2 3 5   2 4 5   3 4 5

【输入】

一行两个自然数 n、r (1<n<21,1≤r≤n)。

【输出】

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

【输入样例】
5 3
【输出样例】
  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5
AC 代码参考
#include <bits/stdc++.h>
using namespace std;
int n,r;
int a[24], vis[24];
void dfs(int step) {
//边界
if (step==r+1) {
//输出解
for (int i=1; i<=r; ++i) cout<<setw(3)<<a[i];
cout<<endl;
return ;
}
for (int i=1; i<=n; ++i) {
if (!vis[i] && i>a[step-1]) { //条件
a[step]=i;
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
}
int main() {
//解绑
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>r;
dfs(1);
return 0;
}
© CC BY-NC-SA 4.0
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇

本文发表于 891 天前,其中的信息可能已经有所发展或是发生改变。