图的深度优先搜索遍历算法分析及其应用

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

重庆邮电大学

数学大类专业

2008级《数学建模与数学实验》课程设计

设计题目:图的深度优先搜索遍历算法分析及其应用设计时间:2010.9.7-----2010.9. 12

班级:

学号:

指导教师:

图的深度优先搜索遍历算法分析及其应用

摘要:文章介绍了图论,图的基本概念及其图的表示方法。详细的分析了图中以邻接表为存储结构进行的图的深度优先搜索遍历的算法,并且在VC++环境中实现其算法的过程,对运行记过做了一定量的分析,最后介绍了基于该算法的一些应用。

关键词:图;深度优先搜索;遍历;算法

图论〔Graph Theory〕是数学的一个分支。它以图为研究对象。图论中的图是由若干给定的点及连接两点的线所构成的图形,这种图形通常用来描述某些事物之间的某种特定关系,用点代表事物,用连接两点的线表示相应两个事物间具有这种关系。

图(Graph)是一种较线性表和树更复杂的数据结构,图形结构中,结点之间的关系可以是任意的,图中任意两个数据元素之间都可能相关。因此,在研究有关图的问题时,要考虑图中每个顶点的信息,访问图中的各个顶点,而访问图中各个顶点的操作过程即使图的遍历,图的遍历算法是求解图的连通性问题,拓扑排序和求关键路径等算法的基础。

1图的三元组定义

图G是一个三元组由集合V,E和关联函数组成,记为:G=(V,E,W(G))。其中V是顶点的集合,表示V(G)={V1,V2,V3,……Vn},V(G)≠NULL。E是V中的点偶对的有穷集,表示为E(G)={e1,e2,e3……em},其中ei为或{Vj,Vt},若ei为{Vj,Vt},称ei为以V j 和Vt为端点的无向边;若ei 为,称ei为以V j为起点,Vt为终点的有向边;W(G)称为E→VxV的关联函数。

2图的存储结构

图的存储结构除了要存储图中各个顶点的本身的信息外,同时还要存储顶点与顶点之间的所有关系(边的信息),因此,图的结构比较复杂,很难以数据元素在存储区中的物理位置来表示元素之间的关系,但也正是由于其任意的特性,故物理表示方法很多。常用的图的存储结构有邻接矩阵、邻接表、十字链表和邻接多重表。邻接表是图的一种链式存储结构。对图的每个顶点建立一个单链表(n 个顶点建立n个单链表),第i个单链表中的结点包含顶点Vi的所有邻接顶点。

图1 无向图G

该图的G的邻接表表示如下:

为了便于理解,本文以无向图G作为具体示例(如图1所示),给出以邻接表进行存储的图的数据结构。

现将图G的各顶点进行编号,其对应的邻接表如图2所示:

图2图G的邻接表表示

2.1邻接表的数据结构定义,将图G采用邻接表存储。其结构有:

#include "iostream.h"

int *visited; //存放当前结点是否遍历

typedef int **MGraph;//定义一个二维数组存放邻接矩阵,暂不定义矩阵大小,数据元素类型为整型

//把矩阵看作数组元素是一维数组的一个一维数组

struct ArcNode{ //定义邻接表中的边结点类型

int adjvex; //邻接点位置

int weight; //权值

ArcNode *nextarc; //指向下一个边结点的链域

};

struct VNode{

int data;

ArcNode *nextarc;

};//邻接表表头结点

typedef VNode *adjlist;

//邻接矩阵存储方式

void InitGraph(MGraph &G,int n) //建立n行n列的二维数组

{

G=new int *[n];//分配第一维空间

int i,j;

for(i=0;i

G[i]=new int[n];//分配第二维空间

for(i=0;i

for(j=0;j

G[i][j]=0;//初始情况下没有连接

}

2.2构造算法:

void CreateGraph(MGraph &G,int n){//建立无向图,其它形式的图可以自己建立int i,j,e;

cout<<"输入无向图中边的总数量";

cin>>e;

cout<<"\n输入每条边的起点和终点序号(注:结点编号范围为0~n-1):\n";

for(int k=1;k<=e;k++){

cout<<"\n第"<

cin>>i>>j;

if(i>n||j>n||i<0||j<0) return;

G[i][j]=G[j][i]=1;}

}

//初始化

void InitAdj(adjlist &G,int n)

{

G=new VNode[n];

for(int i=0;i

}

//建立邻接表存储方式的图

void CreateAdj(adjlist &G,int n)

{

int i,j,k,e;

cout<<"输入图的总边数:";

cin>>e;

cout<<"\n输入每条边的起点和终点序号(注:结点编号范围为0~n-1):\n";

for(k=1;k<=e;k++){

cout<<"\n第"<

cin>>i>>j;

if(i>n||j>n||i<0||j<0) return;

//向序号为i的链表中插入一个边结点

ArcNode*p=new ArcNode;

p->adjvex=j;p->weight=1;

p->nextarc=G[i].nextarc;

G[i].nextarc=p;

//向序号为j的链表中插入一个边结点

p=new ArcNode;

相关文档
最新文档