DFS & BFS

DFS(Depth-First-Search)深度优先搜索算法,是搜索算法的一种。是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点 。

介绍如下:http://baike.baidu.com/link?url=-Qr8pxnyPEe03J07nhRELWcTFjhY4CDPwNn-dpRdDAfMX9_yYFiYj-382urgVFO9A39GdG7NsUt2gIOq6byWoNzjT-KP5gPjH8If3WqpbtC

一般用于图的遍历和树的遍历

可以参考这篇文章:http://blog.csdn.net/lulipeng_cpp/article/details/7524133

 

实现如下:

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 using namespace std;
 5 
 6 vector<pair<int,int> > eg[100];
 7 
 8 typedef pair<int,int> pa;
 9 
10 bool visit[100];
11 
12 void dfs_graph(int n,int d)
13 {
14           void dfs(int v);
15 
16           for(int i = 0;i<n;i++)
17                     visit[i] = false;
18 
19           for(int i = 0;i<n;i++)//遍历每个顶点是为了防止图不连通时无法访问每个顶点 
20           {
21                     if(visit[i]==false)
22                               dfs(i);
23           }
24 }
25 
26 void dfs(int v)
27 {
28           visit[v] = true;
29           cout<<v<<" -> ";
30           for(int i = 0;i<eg[v].size();i++)//遍历v的所有邻接点
31           {
32                     pa x = eg[v][i];
33                     if(visit[x.first]==false)
34                     {
35                               dfs(x.first);//递归
36                     }
37           }
38 }
39 
40 
41 int main()
42 {
43           int n,d;
44           cin>>n>>d;
45           for(int i = 0;i<d;i++)
46           {
47                     int t,s,w;
48                     cin>>t>>s>>w;
49                     eg[t].push_back(make_pair(s,w));
50           }
51           dfs_graph(n,d);
52 
53 
54 
55 }
56 /*
57 6 8
58 0 1 2
59 0 3 4
60 1 4 4
61 2 0 5
62 2 5 2
63 3 4 3
64 3 5 7
65 5 4 3
66 */

 

BFS:

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。

 

介绍如下:

http://baike.baidu.com/view/288267.htm?fromtitle=BFS&fromid=542084&type=syn

 

思路是先逐个访问某点的所有邻接点,同时用队列将邻接点压入,然后访问队列头元素,直至队列为空

 

实现如下:

 1 #include <iostream>
 2 #include <vector>
 3 #include <queue>
 4 using namespace std;
 5 
 6 vector<pair<int,int> > eg[100];
 7 
 8 typedef pair<int,int> pa;
 9 
10 bool visit[100];
11 
12 void bfs_graph(int n,int d)
13 {
14           void bfs(int v);
15 
16           for(int i = 0;i<n;i++)
17                     visit[i] = false;
18 
19           for(int i = 0;i<n;i++)//遍历每个顶点是为了防止图不连通时无法访问每个顶点
20           {
21                     if(visit[i]==false)
22                               bfs(i);
23           }
24 }
25 
26 void bfs(int v)
27 {
28           visit[v] = true;
29           cout<<v<<" -> ";
30 
31           queue<int> q;
32           q.push(v);
33           while(!q.empty())
34           {
35                     int s = q.front();
36                     q.pop();
37                     for(int i = 0;i<eg[s].size();i++)//遍历v的所有邻接点
38                     {
39                               pa x = eg[s][i];
40                               if(visit[x.first]==false)
41                               {
42                                         visit[x.first] = true;
43                                         q.push(x.first);
44                                         cout<<x.first<<" -> ";
45 
46                               }
47                     }
48           }
49 }
50 
51 
52 int main()
53 {
54           int n,d;
55           cin>>n>>d;
56           for(int i = 0;i<d;i++)
57           {
58                     int t,s,w;
59                     cin>>t>>s>>w;
60                     eg[t].push_back(make_pair(s,w));
61           }
62           bfs_graph(n,d);
63 
64 
65 
66 }
67 /*
68 6 8
69 0 1 2
70 0 3 4
71 1 4 4
72 2 0 5
73 2 5 2
74 3 4 3
75 3 5 7
76 5 4 3
77 */

 

posted @ 2015-11-22 15:33  qlky  阅读(475)  评论(0编辑  收藏  举报