ACM__搜素之BFS与DFS

BFS(Breadth_First_Search)

DFS(Depth_First_Search)

拿图来说

BFS过程,以1为根节点,1与2,3相连,找到了2,3,继续搜2,2与4,相连,找到了4,2与3也相连,然而3已经被找到了,跳过;搜3,3与5相连,找到了5;搜4,4与5相连,5已经被找到了,跳过,4与6相连,找到了6;5,6没有连其他点,结束;

DFS过程:以1为根节点,1与2,3相连;搜2,2与3,4相连;搜3,3与5相连;搜5,5没有与其他边相连,返回到3,3没有与其他边相连,返回到2;2还与4相连;搜4,4与5,6相连,5已经被找到了;搜6,6没有与其他点相连,返回到4,4已经搜完了,返回到2,2已经被搜完了,返回到1;1还与3相连,3已经被搜过了,结束!

BFS是一层一层的搜,DFS是一直搜到底,直到不能搜为止,再一层一层的递归

存图方式:

1:可以用二维数组来存,当需要存的数据太大的话,就不能用了,不过有些题也是可以用的

int edge[105][105];
cin<<a<<b;
edge[a][b]=1;

2:可以用邻接链表来写,一般用vector

vector<int>edge[100];
cin<<a<<b;
edge[a].push_back(b);

3:  链式前向星(等复习到这的时候再来补充吧)

具体过程代码

BFS

 1 #include<queue>
 2 #include<vector>
 3 #include<cstdio>
 4 using namespace std;
 5 bool vis[105]
 6 void BFS()
 7 {
 8 queue<int>q;
 9 memset(vis,0,sizeof(vis));//先将所有节点初始化,还没有访问过
10 vis[root]=1;//找一个根节点,标记为1
11 q.push(a);//把该元素压入队列
12 while(!q.empty())
13 {
14 u=q.front();//取队列的首元素
15 q.pop();//首元素出队
16 for(int i=0;i<edge[u].size();i++)
17 {
18 if(vis[edge[u][i]]==0)//如果该点没有被访问过
19 {
20 vis[edge[u][i]]=1;//表示该点已经访问过
21 q.push(edge[u][i]);//入队
22 }
23 }
24 }
25 }
26 int main()
27 {
28 vector<int>edge[100];
29 cin<<a<<b;
30 edge[a].push_back(b);//输入所有边
31 BFS();//进行搜索
32 }

感觉像是,先找到根节点,入队,出队,再让与之相连的点入队,再是出队,让与之相连的点出队,重复这个过程,直到队列为空

DFS

DFS用递归实现

 1 vis[100];
 2 void DFS(int u)
 3 {
 4     vis[i]=1;
 5     for(int i=0;i<edge[u].size();i++)
 6     {
 7         if(vis[edge[u][i]]==0)
 8         {
 9             
10             DFS(edge[u][i]);
11         }
12     }
13 }
14 int main()
15 {
16     memset(vis,0,sizeof(vis));
17 }
原文地址:https://www.cnblogs.com/LLLAIH/p/9677594.html