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 */