图的递归深度遍历(邻接矩阵表示)

#include "stdafx.h"
#include <iostream>
using namespace std;

const int MAX_VERTEX_NUM=5;			//邻接矩阵最大的维数

//图采用邻接矩阵存储的定义
typedef struct MGraph{
    int AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];    //邻接矩阵
    int vexnum;            //图的顶点数量
    int arcnum;		      //图的边数,这个程序里没有用到
};



/*****************************************************************
Name:			DFS

Inputs:
    MGraph G -邻接矩阵表示的图
    int v   -   节点的序号,这里同时可表示数组坐标
    int visited[]  - 标记数组,判断是否访问过

Return Value:
    none

Description:   递归访问图的节点。将要被DFSTraverse调用
*****************************************************************/
void DFS(MGraph G,int v,int visited[]){
    visited[v] = true;         //标记为已访问
    cout<<G.AdjMatrix[v][v]<<" ";
    int w = 0;
    while(w<MAX_VERTEX_NUM)
    {
        if (w==v ) ++w;     //如果w==v,则是自身节点,要跳过

        else if (G.AdjMatrix[v][w] != 0)   //此时邻接矩阵的值不为0,证明两点之间是相连的
            break;                                          //这是我们要找的点

        else ++w;                          //继续向下苦苦寻找
    }
    if( !visited[w]) DFS(G,w,visited);
}

void DFSTraverse(MGraph G){
    //对图G做深度优先遍历
    int visited[MAX_VERTEX_NUM]={0};   //这里的visited数组为了标识是否访问过

    for (int v = 0;v < G.vexnum; ++v)
        if( !visited[v]) DFS(G,v,visited);
} 



int _tmain(int argc, _TCHAR* argv[])
{
    //定义二维数组,一会初始化邻接矩阵
    //11,22,---55代表节点1-5的权值,0代表不能通过,1代表可以通过
    int arr[5][5]={11,1,0,1,0,
                            1,22,1,0,1,
                            0,1,33,1,1,
                            1,0,1,44,0,
                            0,1,1,0,55};
    MGraph mg;

    for( int i=0; i<5; ++i )
        for( int j=0; j<5; ++j )
            mg.AdjMatrix[i][j]=arr[i][j];    //初始化邻接矩阵

    mg.vexnum=5;   //顶点的个数是5个,这里非常无耻的赋值为5

    DFSTraverse(mg);   //调用深度遍历

    return 0;
}

 

参考文献:《数据结构》(c语言版)  严蔚敏 吴伟明 编著  清华大学出版社

    原文作者:数据结构之图
    原文地址: https://blog.csdn.net/mutex86/article/details/8191363
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞