图的遍历

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

题目:图的遍历

专业班级:计算机科学与技术2班

指导老师:骆嘉伟

完成时间:2010年12月7日

问题描述:

若用有向网表示网页的连接网络,其中顶点表示某个网页,有向弧表

示网页之间的连接关系,试设计一个网络蜘蛛系统,分别以广度优先和深度优先的策略抓取网页。

基本要求:

(1)首先输入顶点数,然后各定点对应的字母,再输入各条弧(权值都设置为1)。

(2)输出从首个顶点开始的广度优先遍历序列和深度优先遍历序列。

(3)输入输出形式:

输入

输入顶点数和弧数:8 9

输入8个顶点.

输入顶点0:a

输入顶点1:b

输入顶点2:c

输入顶点3:d

输入顶点4:e

输入顶点5:f

输入顶点6:g

输入顶点7:h

输入9条弧.

输入弧0:a b 1

输入弧1:b d 1

输入弧2:b e 1

输入弧3:d h 1

输入弧4:e h 1

输入弧5:a c 1

输入弧6:c f 1

输入弧7:c g 1

输入弧8:f g 1

输出

广度优先遍历: a b d h e c f g

深度优先遍历: a b c d e f g h

实现提示

(1)设图的顶点大于1个,不超过30个,每个顶点用一个编号表示(如果一个图有n个顶点,则它们的编号分别为0, 1, 2, 3, …, n-1)。(2)此题为求有向图的遍历问题,采用邻接表存储图,实现图的基本操作,并编写DFS

实验分析:

(1)图的特点是没有首尾之分,所以算法的参数要指定访问的第一个顶点。(2)对图的遍历路径有可能构成一个回路,从而造成死循环,所以算法设计要考虑遍历路径可能出现的死循环问题。(3)一个顶点可能和若干个顶点都是邻接顶点,要使一个顶点的所有邻接顶点按照某种次序被访问。

深度优先搜索遍历

连通图的深度优先遍历递归算法可描述为:(1)访问顶点vi并标记顶点vi为已访问;(2)查找顶点v的第一个邻接顶点vj;(3)若顶点v 的邻接顶点vj存在,则继续执行,否则算法结束;(4)若顶点vj尚未被访问,则深度优先遍历递归访问顶点vj;(5)查找顶点vi的邻接顶点vj的下一个邻接顶点,转到步骤(3)。

当寻找顶点vi的邻接顶点vj成功时继续进行,当寻找顶点vi的邻接顶点vj失败时回溯到上一次递归调用的地方继续进行。为了在遍历过程中便于区分顶点是否被访问,需附设访问标志数组visited[ ],其初值为0,一旦某个顶点被访问,则其相应的分量置为1。

图的广度优先遍历算法:

需要一个队列以保持访问过的顶点的顺序,以便按顺序访问这些顶点邻接顶点。连通图的广度优先遍历算法为:(1)访问初始顶点v并标记顶点v为已访问;(2)顶点v入队列;(3)当队列非空时则继续执行,否则算法结束;(4)出队列取得队头顶点u;(5)查找顶点u的第一个邻接顶点w;(6)若顶点u的邻接顶点w不存在,则转到步骤(3),否则执行后序语句:①若顶点w尚未被访问,则访问顶点w并标记顶点w为已访问;②顶点w入队列;③查找顶点u的邻接顶点w后的下一个邻接顶点,转到步骤(6)。

实验代码:

#include

#define INFINITY 32767

#define MAX_VEX 20 //最大顶点个数

#define QUEUE_SIZE (MAX_VEX+1) //队列长度using namespace std;

bool *visited; //访问标志数组

//图的邻接矩阵存储结构

typedef struct{

char *vexs; //顶点向量

int arcs[MAX_VEX][MAX_VEX]; //邻接矩阵int vexnum,arcnum; //图的当前顶点数和弧数

}Graph;

//队列类

class Queue{

public:

void InitQueue(){

base=(int *)malloc(QUEUE_SIZE*sizeof(int));

front=rear=0;

}

void EnQueue(int e){

base[rear]=e;

rear=(rear+1)%QUEUE_SIZE;

}

void DeQueue(int &e){

e=base[front];

front=(front+1)%QUEUE_SIZE;

}

public:

int *base;

int front;

int rear;

};

//图G中查找元素c的位置

int Locate(Graph G,char c){

for(int i=0;i

if(G.vexs[i]==c) return i;

return -1;

}

//创建无向网

void CreateUDN(Graph &G){

int i,j,w,s1,s2;

char a,b,temp;

cout<<"输入顶点数和弧数:";

cin>>G.vexnum>>G.arcnum;

temp=getchar(); //接收回车

G.vexs=(char *)malloc(G.vexnum*sizeof(char)); //分配顶点数目cout<<"输入顶点:"<

相关文档
最新文档