图的遍历 - 数据结构

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               


概述

图的遍历是指从图中的任一顶点出发,对图中的所有顶点访问一次且只访问一次。图的遍历操作和树的遍历操作功能相似。图的遍历是图的一种基本操作,图的其它算法如求解图的连通性问题,拓扑排序,求关键路径等都是建立在遍历算法的基础之上。

由于图结构本身的复杂性,所以图的遍历操作也较复杂,主要表现在以下四个方面:
① 在图结构中,没有一个“自然”的首结点,图中任意一个顶点都可作为第一个被访问的结点。
② 在非连通图中,从一个顶点出发,只能够访问它所在的连通分量上的所有顶点,因此,还需考虑如何选取下一个出发点以访问图中其余的连通分量。
③ 在图结构中,如果有回路存在,那么一个顶点被访问之后,有可能沿回路又回到该顶点。

④ 在图结构中,一个顶点可以和其它多个顶点相连,当这样的顶点访问过后,存在如何选取下一个要访问的顶点的问题。

图的遍历通常有深度优先搜索和广度优先搜索两种方式,他们对无向图和有向图都适用。

1.深度优先搜索

深度优先搜索(Depth_Fisrst Search)遍历类似于树的先根遍历,是树的先根遍历的推广。

 假设初始状态是图中所有顶点未曾被访问,则深度优先搜索可从图中某个顶点发v 出发,访问此顶点,然后依次从v 的未被访问的邻接点出发深度优先遍历图,直至图中所有和v 有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾被访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

以如下图的无向图G5为例,进行图的深度优先搜索:


G5

搜索过程:



假设从顶点v1 出发进行搜索,在访问了顶点v1 之后,选择邻接点v2。因为v2 未曾访问,则从v2 出发进行搜索。依次类推,接着从v4 、v8 、v5 出发进行搜索。在访问了v5 之后,由于v5 的邻接点都已被访问,则搜索回到v8。由于同样的理由,搜索继续回到v4,v2 直至v1,此时由于v1 的另一个邻接点未被访问,则搜索又从v1 到v3,再继续进行下去由此,得到的顶点访问序列为:



显然,这是一个递归的过程。为了在遍历过程中便于区分顶点是否已被访问,需附设访问标志数组visited[0:n-1], ,其初值为FALSE ,一旦某个顶点被访问,则其相应的分量置为TRUE。
1)邻接矩阵的存储方式实现:

// stdafx.h : include file for standard system include files,// or project specific include files that are used frequently, but// are changed infrequently//#pragma once#include "targetver.h"#include <stdio.h>  #include "stdlib.h"#include <iostream>using namespace std;//宏定义    #define TRUE   1    #define FALSE   0   #define NULL 0#define OK    1    #define ERROR   0  #define INFEASIBLE -1    #define OVERFLOW -2  #define INFINITY   INT_MAX#define MAX_VERTEX_NUM 30typedef int Status   ;typedef int ElemType ;typedef int VrType  ;typedef char VertexType  ;/************************************************************************//* 数组表示:邻接矩阵数据结构*//************************************************************************/typedef struct ArcCell{
     VrType adj;       //顶点关系类型,对无权图,0/1表示是否相邻,有权图表示权值 ArcCell  *info;      //弧相关信息的指针}ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];typedef struct{
     VertexType vexs[MAX_VERTEX_NUM];   //顶点向量 AdjMatrix arcs;                    //邻接矩阵 int vexnum,arcnum;                 //图的当前顶点数和弧数}MGraph;


// Test.cpp : Defines the entry point for the console application.  //  #include "stdafx.h" bool visited[MAX_VERTEX_NUM];  //访问标识Status (*VisitFunc) (int v);   //函数变量/************************************************************************//*   确定顶点v在图G的位置*//************************************************************************/int LocateVex(MGraph G,VertexType v)for(int i = 0; i<G.vexnum; ++i) {  if(G.vexs[i] == v) return i;//找到 } return -1;//不存在}/************************************************************************//*    *//************************************************************************/int FirstAdjVex(MGraph G,int v)int i ; for(i = 0; i<G.vexnum; i++)  if( G.arcs[v][i].adj ) return i; if(i == (G.vexnum  -1)) return -1return -1; }int NextAdjVex(MGraph G,int v,int w)int i; for( i = w+1; i<G.vexnum; i++)//+1  if(G.arcs[v][i].adj) return i; if(i == (G.vexnum  -1)) return -1return -1;}/************************************************************************//* 邻接矩阵的无向图的创建: 注释的代码可以动态生成图。*//************************************************************************/void CreatUDG(MGraph &G)cout<<"创建邻接矩阵的无向图:"<<endlint i,j,k,w; //G5的存储: G.arcnum = 8; G.vexnum = 9for(i=0;i<G.vexnum;++i)  for(j=0;j<G.vexnum;++j) {   G.arcs[i][j].adj=0;   G.arcs[i][j].info=NULL;  } G.vexs[0] = '1'; G.vexs[1] = '2'; G.vexs[2] = '3'; G.vexs[3] = '4'; G.vexs[4] = '5'; G.vexs[5] = '6'; G.vexs[6] = '7'; G.vexs[7] = '8'; G.arcs[0][1].adj = 1
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值