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

#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
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞