#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语言版) 严蔚敏 吴伟明 编著 清华大学出版社