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 }