当前位置:首页 » 服务存储 » 采用领接表存储的图类似树的
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

采用领接表存储的图类似树的

发布时间: 2022-04-01 17:57:56

① 如下图表示的是用邻接表存储的图,画出此图,并写出从A点开始按广度优先算法遍历该图的结果(附上过程)

广度优先遍历:ABDFEC
1、A的邻接点B和D
2、B的邻接点D和F,D已经遍历,只访问F
3、D的邻接点E
4、F的邻接点E,已经遍历
5、E无邻接点
6、最后扫描所有头结点C未访问,再从C开始遍历,C的邻接点DA都已遍历。

② 在图采用邻接表存储时,求最小生成树的 Prim 算法的时间复杂度为

邻接表储存时,是B。邻接矩阵储存就是C了。

③ 用邻接表表示图进行深度优先遍历时,通常采用()来实现算法

使用栈来实现算法。

用邻接表表示图进行深度优先遍历时,通常采用栈来实现算法,广度遍历使用队列。

扩展材料:

深度优先遍历:类似与树的前序遍历。从图中的某个顶点v出发,访问此顶点,然后从v的未被访问到的邻接点进行遍历,直到图中所有和v有路径相通的顶点都被访问到

注:优先访问外层节点,访问到无新顶点时,会进行回退,访问未被访问过的分支顶点。

广度优先遍历:类似于树的层序遍历。从图中的某个顶点w出发,让顶点w入队,然后顶点w再出队,并让所有和顶点w相连的顶点入队,然后再出队一个顶点t,并让所有和t相连但未被访问过的顶点入队……由此循环,指定图中所有元素都出队。


参考资料来源:

知网论文-数据结构中图的遍历算法研究

④ 邻接表的存储结构下图的深度优先遍历类似于二叉树(树)的( )。

先序遍历。--------------------肯定正确

⑤ 数据结构,如何根据邻接表画深度,广度优先生成树

深搜中枚举时由大到小就是这个结果。

#include"stdio.h"

#include"stdlib.h"

#define MaxVertexNum 100 //定义最大顶点数

typedef struct{

char vexs[MaxVertexNum]; //顶点表

int edges[MaxVertexNum][MaxVertexNum]; //邻接矩阵,可看作边表

int n,e; //图中的顶点数n和边数e

}MGraph; //用邻接矩阵表示的图的类型

//=========建立邻接矩阵=======

void CreatMGraph(MGraph *G)

{

int i,j,k;

char a;

printf("Input VertexNum(n) and EdgesNum(e): ");

scanf("%d,%d",&G->n,&G->e); //输入顶点数和边数

scanf("%c",&a);

printf("Input Vertex string:");

G->vexs[i]=a; //读入顶点信息,建立顶点表

}

for(i=0;i<G->n;i++)

for(j=0;j<G->n;j++)

G->edges[i][j]=0; //初始化邻接矩阵

printf("Input edges,Creat Adjacency Matrix ");

for(k=0;k<G->e;k++) { //读入e条边,建立邻接矩阵

scanf("%d%d",&i,&j); //输入边(Vi,Vj)的顶点序号

G->edges[i][j]=1;

G->edges[j][i]=1; //若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句

}

//=========定义标志向量,为全局变量=======

typedef enum{FALSE,TRUE} Boolean;

Boolean visited[MaxVertexNum];

//========DFS:深度优先遍历的递归算法======

void DFSM(MGraph *G,int i)

visited[i]=TRUE; //置已访问标志

for(j=0;j<G->n;j++) //依次搜索Vi的邻接点

if(G->edges[i][j]==1 && ! visited[j])

DFSM(G,j); //(Vi,Vj)∈E,且Vj未访问过,故Vj为新出发点

void DFS(MGraph *G)

{

int i;

for(i=0;i<G->n;i++)

visited[i]=FALSE; //标志向量初始化

for(i=0;i<G->n;i++)

if(!visited[i]) //Vi未访问过

DFSM(G,i); //以Vi为源点开始DFS搜索

}

//==========main=====

void main()

{

//int i;

MGraph *G;

G=(MGraph *)malloc(sizeof(MGraph)); //为图G申请内存空间

CreatMGraph(G); //建立邻接矩阵

printf("Print Graph DFS: ");

DFS(G); //深度优先遍历

printf(" ");

}

(5)采用领接表存储的图类似树的扩展阅读:

图的邻接表存储方法跟树的孩子链表示法相类似,是一种顺序分配和链式分配相结合的存储结构。如这个表头结点所对应的顶点存在相邻顶点,则把相邻顶点依次存放于表头结点所指向的单向链表中。

如词条概念图所示,表结点存放的是邻接顶点在数组中的索引。对于无向图来说,使用邻接表进行存储也会出现数据冗余,表头结点A所指链表中存在一个指向C的表结点的同时,表头结点C所指链表也会存在一个指向A的表结点。

⑥ 采用邻接表存储的图的深度优先遍历算法类似于二叉树的先序遍历,为什么是先序呢

这是因为图的深度优先遍历算法先访问所在结点,再访问它的邻接点。与二叉树的先序遍历先访问子树的根结点,再访问它的孩子结点(邻接点)类似。图的广度优先遍历算法类似于二叉树的按层次遍历。

先序遍历也叫做先根遍历、前序遍历,可记做根左右(二叉树父结点向下先左后右)。

首先访问根结点然后遍历左子树,最后遍历右子树。在遍历左、右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树,如果二叉树为空则返回。

例如,下图所示二叉树的遍历结果是:ABDECF。

(6)采用领接表存储的图类似树的扩展阅读:

遍历种类:

一、NLR:前序遍历(Preorder Traversal 亦称(先序遍历)),访问根结点的操作发生在遍历其左右子树之前。

二、LNR:中序遍历(Inorder Traversal),访问根结点的操作发生在遍历其左右子树之中(间)。

三、LRN:后序遍历(Postorder Traversal),访问根结点的操作发生在遍历其左右子树之后。

注意:

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为 先根遍历、中根遍历和后根遍历。

⑦ 如何用邻接表存储图结构

我看不太懂这个程序,不过我有些过图的邻接表表示,看对你有没有帮助吧。
#include <iostream>
#include <fstream>
#include <vector>

typedef int QElemTyep;
#include "queue.h"
using namespace std;
typedef int Status;
#define MAX_VERTEX_NUM 30 //图的最大顶点数
enum BOOL {False,True};
BOOL visited[MAX_VERTEX_NUM]; //全局变量--访问标志数组

typedef struct ArcNode{
//弧结点
int adjvex; //该弧所指向的顶点的位置
struct ArcNode *nextarc; //指向下一条弧的指针
InfoType *info; //保存边的信息,可以简单的改为 int w;
}ArcNode;
typedef struct VNode{
VertexType data;
ArcNode *firstarc;
}VNode,AdjList[MAX_VERTEX_NUM];

class Graph{
public: AdjList vertices; //记录顶点信息,指向第一条依附该顶点的弧的指针
int vexnum,arcnum; //图的当前顶点和弧数
int GraphKind; //图的种类,0---无向图,1---有向图
Graph(int vexnum,int arcnum,int kind)
{
this->vexnum=vexnum;
this->arcnum=arcnum;
this->GraphKind=kind;
}
};
void CreateGraph(Graph &G,VertexType *V,ArcType *VR){
//构造邻接表结构的图G

int i;
ArcNode *s;
for(i=1;i<=G.vexnum;i++) //初始化指针数组
{
G.vertices[i].data=V[i];
G.vertices[i].firstarc=NULL;
}
for(i=1;i<=G.arcnum;i++)
{
s=(ArcNode *)malloc(sizeof(ArcNode)); //生成一个弧结点
s->nextarc=G.vertices[VR[i].start].firstarc; //插入到邻接表中
s->adjvex=VR[i].end;
G.vertices[VR[i].start].firstarc=s;

if(G.GraphKind==0) {
//若是无向图,再插入到终点的弧链中
s=(ArcNode *)malloc(sizeof(ArcNode));
s->nextarc=G.vertices[VR[i].end].firstarc;
s->adjvex=VR[i].start;
G.vertices[VR[i].end].firstarc=s;
}
}
}

⑧ 用邻接表表示图的广度优先搜索时的存储结构,通常采用()结构来实现算法

B。

广度优先搜索相当于层次遍历,深度优先搜索相当于先序优先遍历,所以答案选择B。

邻接表表示的图的广度优先搜索一般采用队列结构来实现算法:

首先选择一个起始节点,把它的临界表中节点加入到队列中,每次取出队首元素,然后把该元素的邻接表中的节点加入到队列末尾,标记已遍历过的节点,直到队列中没有节点为止,一般栈用于深度优先搜索,队列用于广度优先搜索。

(8)采用领接表存储的图类似树的扩展阅读:

深度优先搜索用一个数组存放产生的所有状态。

(1) 把初始状态放入数组中,设为当前状态;

(2) 扩展当前的状态,产生一个新的状态放入数组中,同时把新产生的状态设为当前状态;

(3) 判断当前状态是否和前面的重复,如果重复则回到上一个状态,产生它的另一状态;

(4) 判断当前状态是否为目标状态,如果是目标,则找到一个解答,结束算法。

⑨ 采用邻接表存储的图的宽度优先遍历算法类似于二叉树的()A.先序遍历 B.中序遍历 C . 后序遍历

是啊,宽度优先就是访问某顶点完后,将其所有邻接的未访问的顶点都访问,这样第一次访问自己,第二次访问的就是所有距离该顶点路径长度为1的顶点,第三次访问的就是所有距离该顶点路径长度为2的顶点...
二叉树的层次遍历不就是从根开始,先访问根,接着访问所有第二层结点,再访问所有第3层结点...,从路径长度来看,不是也是0、1、2、....