DFS实现模板
以如下图的无向图G4为例,进行图的深度优先搜索:
假设从顶点v1出发进行搜索,在访问了顶点v1之后,选择邻接点v2。因为v2未曾访问,则从v2出发进行搜索。依次类推,接着从v4 、v8 、v5出发进行搜索。在访问了v5之后,由于v5的邻接点都已被访问,则搜索回到v8。由于同样的理由,搜索继续回到v4,v2直至v1,此时由于v1的另一个邻接点未被访问,则搜索又从v1到v3,再继续进行下去由此,得到的顶点访问序列为:
代码:
1 /* 图的DFS遍历 */ 2 //邻接矩阵形式实现 3 //顶点从1开始 4 #include<iostream> 5 #include<cstdio> 6 using namespace std; 7 const int maxn = 105; //最大顶点数 8 typedef int VertexType; //顶点类型 9 bool vis[maxn]; 10 11 struct Graph{ //邻接矩阵表示的图结构 12 VertexType vex[maxn]; //存储顶点 13 int arc[maxn][maxn]; //邻接矩阵 14 int vexnum,arcnum; //图的当前顶点数和弧数 15 }; 16 17 void createGraph(Graph &g) //构建无向图 18 { 19 cout<<"请输入顶点数和边数:"; 20 cin>>g.vexnum>>g.arcnum; 21 22 //构造顶点向量 23 cout<<"请依次输入各顶点:\n"; 24 for(int i=1;i<=g.vexnum;i++){ 25 scanf("%d",&g.vex[i]); 26 } 27 28 //初始化邻接矩阵 29 for(int i=1;i<=g.vexnum;i++){ 30 for(int j=1;j<=g.vexnum;j++){ 31 g.arc[i][j] = 0; 32 } 33 } 34 35 //构造邻接矩阵 36 VertexType u,v; //分别是一条弧的弧尾(起点)和弧头(终点) 37 printf("每一行输入一条弧依附的顶点(空格分开):\n"); 38 for(int i=1;i<=g.arcnum;i++){ 39 cin>>u>>v; 40 g.arc[u][v] = g.arc[v][u] = 1; 41 } 42 } 43 44 //邻接矩阵的深度优先递归算法 45 void DFS(Graph g,int i) 46 { 47 vis[i] = true; 48 printf("%d\t",g.vex[i]); //打印顶点 49 for(int j=1;j<=g.vexnum;j++){ //遍历每个顶点 50 if(g.arc[i][j]==1 && !vis[j]){ //如果顶点j是顶点i的未访问的邻接点 51 DFS(g,j); //深度优先搜索顶点j 52 } 53 } 54 } 55 56 //邻接矩阵的深度遍历操作 57 void DFSTraverse(Graph g) 58 { 59 for(int i=1;i<=g.vexnum;i++){ 60 vis[i] = false; //初始化所有顶点状态都是未访问过状态 61 } 62 for(int i=1;i<=g.vexnum;i++){ 63 if(!vis[i]){ 64 DFS(g,i); //对未访问的顶点调用DFS,若是连通图,只会执行一次 65 } 66 } 67 } 68 69 int main() 70 { 71 Graph g; 72 createGraph(g); 73 DFSTraverse(g); 74 return 0; 75 }