zoukankan      html  css  js  c++  java
  • 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<<"请依次输入各顶点:
    ";
    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("每一行输入一条弧依附的顶点(空格分开):
    ");
    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	",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 }

     

  • 相关阅读:
    毕业季 | 如何做出99分的答辩PPT
    git: error setting certificate verify locations解决办法
    获取表格里面的内容
    MD5加密算法
    mybatis多条件批量删除
    layer.confirm
    DevExpress控件的GridControl实现行多选
    sz与rz命令
    @TableField的使用
    C# WinForm 中Label自动换行 解决方法
  • 原文地址:https://www.cnblogs.com/xzxl/p/7299720.html
Copyright © 2011-2022 走看看