DFS实现模板

以如下图的无向图G4为例,进行图的深度优先搜索:

假设从顶点v1出发进行搜索,在访问了顶点v1之后,选择邻接点v2。因为v2未曾访问,则从v2出发进行搜索。依次类推,接着从v、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 }

 

posted @ 2017-08-07 16:19  GGBeng  阅读(588)  评论(0编辑  收藏  举报