图的深度优先遍历
图的深度优先遍历
图有两种存储方式:邻接矩阵和邻接表。顶点数量较大用邻接表。稀疏图一般用邻接表,稠密图一般用邻接矩阵。
1.图的创建(邻接表的创建)
- 以图为一个类
属性包含:图节点数n,邻接表(大小n),节点是否被访问(visited[]数组,大小n)
方法:insert(int x, int y)用来连接两个节点,从而创建邻接表。dfs(int n)深搜算法,参数为下一个节点。
2.通过连接两两点构成邻接表
2.深搜算法
- 访问节点
- 以该节点为初始点,访问与之相邻的所有节点
- 以递归的算法,如果节点未被访问,则递归调用深搜算法
下面是算法实现:
1 // 图论深度优先遍历.cpp : 定义控制台应用程序的入口点。 2 // 3 4 #include "stdafx.h" 5 #include<iostream> 6 #include<vector> 7 #include<cstring> 8 using namespace std; 9 10 class Graph 11 { 12 private: 13 int n;//图节点数 14 vector<int>* edges; 15 int* visited; 16 public: 17 Graph(int n) 18 { 19 this->n=n; 20 edges = new vector<int>[n]; 21 visited = new int[n]; 22 memset(visited, 0, n*sizeof(int)); 23 } 24 ~Graph() 25 { 26 delete[] edges; 27 delete[] visited; 28 } 29 void insert(int x, int y) 30 { 31 edges[x].push_back(y); 32 edges[y].push_back(x); 33 } 34 void dfs(int k) 35 { 36 cout << k << endl; 37 visited[k] = 1; 38 for(int i=0;i<edges[k].size();i++) 39 { 40 if(!visited[edges[k][i]]) 41 { 42 dfs(edges[k][i]); 43 } 44 } 45 } 46 }; 47 int main() 48 { 49 int n,m; 50 cin>>n>>m; 51 Graph graph(n); 52 for(int i=0;i<m;++i) 53 { 54 int x,y; 55 cin>>x>>y; 56 graph.insert(x,y); 57 } 58 graph.dfs(1); 59 system("pause"); 60 return 0; 61 }