深度优先遍历,这个跟树中的遍历类似,做深度遍历就是访问一个节点之后,在访问这个节点的子节点,依次下去是一个递归的过程。

具体代码:

void DFS(MGraph g ,int i)
{
    int j;
    visited[i]=1;
    printf("%c",g.vexs[i]);
    for(j = 0;j<g.numVertexes;j++)
    {
        if(g.arc[i][j]==1&&visited[i]!=1)
        {
            DFS(g,j);
        }
    }
}

完整代码如下,这边对图的存储结构采用了邻接矩阵

  1.   1: #include <stdio.h>
  2.  
  3.   2:
  4.  
  5.   3: #define MAXVEX 9
  6.  
  7.   4: #define INFINITY 65535
  8.  
  9.   5:
  10.  
  11.   6: typedef struct MGraph
  12.  
  13.   7: {
  14.  
  15.   8: 	char vexs[MAXVEX];
  16.  
  17.   9: 	int arc[MAXVEX][MAXVEX];
  18.  
  19.  10:     int numVertexes, numEdges;
  20.  
  21.  11: }MGraph;
  22.  
  23.  12:
  24.  
  25.  13: int visited[MAXVEX];
  26.  
  27.  14:
  28.  
  29.  15: void createMGraph(MGraph *g);
  30.  
  31.  16: void DFS(MGraph g ,int i);
  32.  
  33.  17: void DFSTraverse(MGraph g);
  34.  
  35.  18:
  36.  
  37.  19: void createMGraph(MGraph *g)
  38.  
  39.  20: {
  40.  
  41.  21: 	int i, j;
  42.  
  43.  22:
  44.  
  45.  23: 	g->numEdges=15;
  46.  
  47.  24: 	g->numVertexes=9;
  48.  
  49.  25:
  50.  
  51.  26: 	g->vexs[0]='A';
  52.  
  53.  27: 	g->vexs[1]='B';
  54.  
  55.  28: 	g->vexs[2]='C';
  56.  
  57.  29: 	g->vexs[3]='D';
  58.  
  59.  30: 	g->vexs[4]='E';
  60.  
  61.  31: 	g->vexs[5]='F';
  62.  
  63.  32: 	g->vexs[6]='G';
  64.  
  65.  33: 	g->vexs[7]='H';
  66.  
  67.  34: 	g->vexs[8]='I';
  68.  
  69.  35:
  70.  
  71.  36:
  72.  
  73.  37: 	for (i = 0; i < g->numVertexes; i++)
  74.  
  75.  38: 	{
  76.  
  77.  39: 		for ( j = 0; j < g->numVertexes; j++)
  78.  
  79.  40: 		{
  80.  
  81.  41: 			g->arc[i][j]=0;
  82.  
  83.  42: 		}
  84.  
  85.  43: 	}
  86.  
  87.  44:
  88.  
  89.  45: 	g->arc[0][1]=1;
  90.  
  91.  46: 	g->arc[0][5]=1;
  92.  
  93.  47:
  94.  
  95.  48: 	g->arc[1][2]=1;
  96.  
  97.  49: 	g->arc[1][8]=1;
  98.  
  99.  50: 	g->arc[1][6]=1;
  100.  
  101.  51:
  102.  
  103.  52: 	g->arc[2][3]=1;
  104.  
  105.  53: 	g->arc[2][8]=1;
  106.  
  107.  54:
  108.  
  109.  55: 	g->arc[3][4]=1;
  110.  
  111.  56: 	g->arc[3][7]=1;
  112.  
  113.  57: 	g->arc[3][6]=1;
  114.  
  115.  58: 	g->arc[3][8]=1;
  116.  
  117.  59:
  118.  
  119.  60: 	g->arc[4][5]=1;
  120.  
  121.  61: 	g->arc[4][7]=1;
  122.  
  123.  62:
  124.  
  125.  63: 	g->arc[5][6]=1;
  126.  
  127.  64:
  128.  
  129.  65: 	g->arc[6][7]=1;
  130.  
  131.  66:
  132.  
  133.  67:
  134.  
  135.  68: 	for(i = 0; i < g->numVertexes; i++)
  136.  
  137.  69: 	{
  138.  
  139.  70: 		for(j = i; j < g->numVertexes; j++)
  140.  
  141.  71: 		{
  142.  
  143.  72: 			g->arc[j][i] =g->arc[i][j];
  144.  
  145.  73: 		}
  146.  
  147.  74: 	}
  148.  
  149.  75:
  150.  
  151.  76: }
  152.  
  153.  77:
  154.  
  155.  78:
  156.  
  157.  79: void DFS(MGraph g ,int i)
  158.  
  159.  80: {
  160.  
  161.  81:     int j;
  162.  
  163.  82:     visited[i]=1;
  164.  
  165.  83:     printf("%c",g.vexs[i]);
  166.  
  167.  84:     for(j = 0;j<g.numVertexes;j++)
  168.  
  169.  85:     {
  170.  
  171.  86:         if(g.arc[i][j]==1&&visited[i]!=1)
  172.  
  173.  87:         {
  174.  
  175.  88:             DFS(g,j);
  176.  
  177.  89:         }
  178.  
  179.  90:     }
  180.  
  181.  91: }
  182.  
  183.  92:
  184.  
  185.  93: void DFSTraverse(MGraph g)
  186.  
  187.  94: {
  188.  
  189.  95:     int i;
  190.  
  191.  96:     for(i=0;i<g.numVertexes;i++)
  192.  
  193.  97:     {
  194.  
  195.  98:         visited[i] = 0;
  196.  
  197.  99:     }
  198.  
  199. 100:     for(i = 0;i<g.numVertexes;i++)
  200.  
  201. 101:     {
  202.  
  203. 102:         if(visited[i]!=1)
  204.  
  205. 103:         {
  206.  
  207. 104:             DFS(g,i);
  208.  
  209. 105:         }
  210.  
  211. 106:     }
  212.  
  213. 107: }
  214.  
  215. 108:
  216.  
  217. 109: int main()
  218.  
  219. 110: {
  220.  
  221. 111:     MGraph g;
  222.  
  223. 112:     createMGraph(&g);
  224.  
  225. 113:     DFSTraverse(g);
  226.  
  227. 114:     return 0;
  228.  
  229. 115: }
  230.  
  231. 116: 

深度优先遍历DFS的更多相关文章

  1. 图的深度优先遍历(DFS)和广度优先遍历(BFS)

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  2. 广度优先遍历-BFS、深度优先遍历-DFS

    广度优先遍历-BFS 广度优先遍历类似与二叉树的层序遍历算法,它的基本思想是:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问的顶点w1 w2 w3....wn,然后再依次访问w1 w2 w3 ...

  3. 图的深度优先遍历DFS

    图的深度优先遍历是树的前序遍历的应用,其实就是一个递归的过程,我们人为的规定一种条件,或者说一种继续遍历下去的判断条件,只要满足我们定义的这种条件,我们就遍历下去,当然,走过的节点必须记录下来,当条件 ...

  4. 图的深度优先遍历(DFS)—递归算法

    实验环境:win10, DEV C++5.11 实验要求: 实现图的深度优先遍历 实验代码: #include <iostream> #define maxSize 255 #includ ...

  5. 图的深度优先遍历(DFS) c++ 非递归实现

    深搜算法对于程序员来讲是必会的基础,不仅要会,更要熟练.ACM竞赛中,深搜也牢牢占据着很重要的一部分.本文用显式栈(非递归)实现了图的深度优先遍历,希望大家可以相互学习. 栈实现的基本思路是将一个节点 ...

  6. 16.boost图深度优先遍历DFS

    #include <iostream> #include <boost/config.hpp> //图(矩阵实现) #include <boost/graph/adjac ...

  7. 图的深度优先遍历(DFS)和广度优先遍历(BFS)算法分析

    1. 深度优先遍历 深度优先遍历(Depth First Search)的主要思想是: 1.首先以一个未被访问过的顶点作为起始顶点,沿当前顶点的边走到未访问过的顶点: 2.当没有未访问过的顶点时,则回 ...

  8. C++版 - 剑指Offer 面试题39:二叉树的深度(高度)(二叉树深度优先遍历dfs的应用) 题解

    剑指Offer 面试题39:二叉树的深度(高度) 题目:输入一棵二叉树的根结点,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度.例如:输入二叉树 ...

  9. 【C++】基于邻接矩阵的图的深度优先遍历(DFS)和广度优先遍历(BFS)

    写在前面:本博客为本人原创,严禁任何形式的转载!本博客只允许放在博客园(.cnblogs.com),如果您在其他网站看到这篇博文,请通过下面这个唯一的合法链接转到原文! 本博客全网唯一合法URL:ht ...

随机推荐

  1. EditText(4)常用属性详解

    常用的属性: 显示密码 通过设置EditText的setTransformationMethod()方法来实现隐藏密码或这显示密码. editText.setTransformationMethod( ...

  2. 转:python中使用txt文本保存和读取变量

    问题: 在python中需要经常有需要提前生成复杂的计算结果变量的需求减少程序计算运行时间的需求,因此这里把变量存在txt文本文件中. 解决方法: 使用两个函数解决问题,一个函数把变量保存到文本文件中 ...

  3. 388 Longest Absolute File Path 最长的绝对文件路径

    详见:https://leetcode.com/problems/longest-absolute-file-path/description/ C++: class Solution { publi ...

  4. js文件中引用其他js文件

    这一个功能的作用是做自己的js包时,可以通过引入一个整体的js文件而引入其他js. 只需要在总体的js加上这一句话 document.write("<script type='text ...

  5. JavaScript 单例,Hash,抛异常

    1. 单例 ECMA 5 版 记得以前写过几种单例实现,找不到了... function Singleton() { if (this.constructor.instance) { return t ...

  6. CAD把控件图形变成二进制流输出(com接口VB语言)

    主要用到函数说明: _DMxDrawX::WriteBinStream 把控件图形变成二进制流输出,详细说明如下: 参数 说明 VARIANT* pVarBinArray 输出二进制数组.是个byte ...

  7. ThinkPHP---案例--实现知识管理功能

    [一]准备工作 (1)数据表sp_knowledge SQL语句:知识管理数据表结构 create table sp_knowledge( id int(11) not null auto_incre ...

  8. [Git]Please make sure you have the correct access rights and the repository exists

    这个问题是这样,需要在已有github账号的A机器上,再创建一个github账号,新账号创建完毕,将代码通过机器A push上之后,再另一台机器B,clone 这个项目时报出了如下错误: Permis ...

  9. 支持向量机(SVM)原理浅析

    因为网页博客输入公式很麻烦,所以就在word上面写了,然后截图发上来. 后续关于SVM和FC在深度学习当中得使用对比分析,我再补充.

  10. [Algorithm] 8. Rotate String

    Description Given a string and an offset, rotate string by offset. (rotate from left to right) Examp ...