图的深度优先遍历

图的深度优先遍历

图有两种存储方式:邻接矩阵和邻接表。顶点数量较大用邻接表。稀疏图一般用邻接表,稠密图一般用邻接矩阵。

1.图的创建(邻接表的创建)

  1. 以图为一个类

属性包含:图节点数n,邻接表(大小n),节点是否被访问(visited[]数组,大小n)

方法:insert(int x, int y)用来连接两个节点,从而创建邻接表。dfs(int n)深搜算法,参数为下一个节点。

2.通过连接两两点构成邻接表

2.深搜算法

  1. 访问节点
  2. 以该节点为初始点,访问与之相邻的所有节点
  3. 以递归的算法,如果节点未被访问,则递归调用深搜算法

下面是算法实现:

 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 }

 

 

posted @ 2018-06-18 22:16  鱼骨頭  阅读(148)  评论(0编辑  收藏  举报